티스토리 뷰
이번엔 serverless에서 제공하는 다양한 기능을 써보려고 한다.
이전 포스팅에서는 너무 한가지만 써봤어서 재미가 없었기 때문에 다양한 기능을 엮어서 엔드 투 엔드로 하나의 세트를 만들어 보려고 한다.
약간의 콘솔 작업이 필요하지만, 차근 차근 진행해보려고 한다.
작업 내용은 이렇다.
1. serverless로 람다, API gateway 생성 후 연동
2. Route 53에서 도메인 발급, 서브도메인 생성
3. 발급받은 서브도메인과 API gateway 연동
4. servless에서 API gateway 재사용하도록 설정
5. 람다와 DDB 연결
정리하면, 발급받은 url로 들어와 api gateway로 들어온 이벤트를 람다에 라우팅해, api gateway의 이벤트 정보들을 ddb에 저장하는데까지 진행해 볼 예정이다.
이번에는 안써봤던 AWS 서비스를 최대한 많이 써보려고 했다.
1. serverless로 람다, API gateway 생성 후 연동
람다를 생성하는 방법은 이전 포스팅과 동일하다.
다만, API gateway를 생성하려면 serverless에 추가 옵션을 지정해주어야한다.
다양한 옵션들이 있지만 디폴트만 작성해봤다.
functions:
function1:
handler: index.handler
package:
individually: true
patterns:
- 'index.js'
events:
- httpApi:
path: /t/{param}
method: GET
위 스크립트를 추가 한 후 deploy를 한번 해주자.
serverless deploy
그리고 API Gateway의 콘솔로 가서 확인해보면,
람다 콘솔로 가보면, 람다도 생성된걸 확인할 수 있다.
다시 API Gateway 콘솔로 돌아와 통합(Integration)을 확인해보면, 람다 함수가 연결되어 있는 걸 확인할 수 있다.
Route 53에서 발급받은 URL과 API gateway을 연동하기 위해서 추가적으로 해줘야하는게 있다.
바로 사용자 지정 도메인 이름을 지정해주고, API 매핑을 구성해줘야한다.
주의할 점은, 사용자 지정 도메인 이름을 사용할 때 Route 53에서 지정한 서브도메인이 포함된 URL과 같은 이름으로 지정해야 한다는 점이다.
만약 이름을 다르게 지정한다면, 아래의 메시지와 함께 403 에러를 보게 될 것이다.
{
"message": "forbidden"
}
이것 때문에 몇 분을 헤맸다.
추가적으로 구성 탭에 있는 d-로 시작하는 API Gateway 도메인을 복사해두자. 바로 사용할 것이다.
서브 도메인을 apigw로 지정했으니 이제 Route 53에서 도메인을 발급받고 서브 도메인을 위와 같은 이름으로 지정해주면 된다.
2. Route 53에서 도메인 발급, 서브도메인 생성
Amazon Route 53는 AWS에서 제공하는 DNS(도메인 이름 시스템) 웹 서비스이다. 그냥 도메인을 발급해주고 라우팅을 해준다 생각하면 된다.
가격은 대략 1년 기준 12~13달러선이다(제일 비싼게 30달러?)
결제는 1년 치가 한번에 되니까 조심해서 사용해야한다.
다음으로는 좌측 탭의 호스팅 영역으로 가면 도메인이 생성 되는데, 그 페이지에서 레코드 생성을 누른다.
API Gateway에 대한 정보는 별칭에서 넣어줄 수 있다.
위에서 복사해 두었던 d-로 시작하는 API Gateway 도메인을 엔드포인트 선택에 넣어 주면된다.
이러면 이제 route 53으로 발급받은 url > API Gateway > Lambda 까지는 정상적으로 들어올 수 있게 된다.
브라우저에 apigw.[도메인]/t/{param}로 이동해보면 아래와 같이 나온다.
3. 람다와 DDB 연동
serverless-ddb-dev 라는 이름의 ddb를 생성한다.
저장할 정보는 그냥 api gateway에서 전달해주는 이벤트 정보에서 뽑아서 저장한다.
DDB에 접근할 수 있도록 IAM 도 지정해준다.
iam:
role:
statements:
- Effect: Allow
Action:
- dynamodb:*
Resource:
- arn:aws:dynamodb:ap-northeast-2:[Your Account]:table/serverless-ddb-dev
코드는 조금 지저분해져서 DDB 연동하는 코드만 가져와봤다.
const { DynamoDBClient } = require('@aws-sdk/client-dynamodb');
const { PutCommand, DynamoDBDocumentClient } = require('@aws-sdk/lib-dynamodb');
const putItem = async (param, event) => {
const client = new DynamoDBClient({});
const translateConfig = { marshallOptions: { convertClassInstanceToMap: true } };
const ddbDocClient = DynamoDBDocumentClient.from(client, translateConfig);
const command = new PutCommand({
TableName: 'serverless-ddb-dev',
Item: { id: param, event: event },
});
const response = await ddbDocClient.send(command);
console.log('DDB Put Item:', JSON.stringify({ input: { id: param, event: event }, result: response }));
return response;
};
이렇게 설정하고, 아래의 요청을 순차적으로 해봤다.
https://apigw.[domain].com/t/kk, https://apigw.[domain].com/t/ww
잘 저장된 것을 확인 할 수 있다.
여기까진 잘 진행했는데, 환경변수와 파일 데이터 가져오기, 태그 설정 등 조금 더 알아볼게 있어서 다음 포스팅에 정리해보려고 한다.
github
https://github.com/imsosleepy/serverless-lambda/tree/main/api-gw-project
마치며
꽤나 번거로운 작업들이었지만, 어쨌든 잘 마무리했다.
개인적으로는 천만 사용자를 위한 AWS 클라우드 아키텍처 진화하기 이 유튜브 내용을 따라가면서 인프라 구축을 해보는 것도 재밌을 것 같은데, 쉽지 않을 것 같다.
이거보다 먼저해야할 게 쿠버네티스랑 테라폼이기 때문이다.
CI/CD와 함께 AWS 리소스, EKS가 복잡하게 얽혀있어 어디서부터 시작해야할지 잘 모르겠다...
'개발 > AWS' 카테고리의 다른 글
AWS IAM 파헤치기 - 역할과 정책, 신뢰관계 (0) | 2023.12.10 |
---|---|
Serverless Framework의 다양한 기능 사용해보기 (2) | 2023.12.07 |
serverless framework로 AWS Lambda 관리하기 (1) | 2023.11.26 |
스프링부트에서 AWS Dynamo DB 사용하기 (JAVA SDK 2.x) (0) | 2023.09.11 |
EKS에서 AWS JAVA SDK 1.0을 사용할 때 발생하는 문제... (0) | 2023.08.08 |
- Total
- Today
- Yesterday
- Elastic cloud
- AWS
- GIT
- CloudFront
- Spring
- Kotlin
- elasticsearch
- ChatGPT
- 후쿠오카
- OpenFeign
- EKS
- 스프링부트
- cache
- openAI API
- MySQL
- 오블완
- JWT
- springboot
- docker
- lambda
- 티스토리챌린지
- OpenAI
- AOP
- 람다
- java
- Log
- serverless
- terraform
- AWS EC2
- S3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |