SAM(serverless application model)
대표적인 기능
- 한 번에 배포
- Lambda 함수, API Gateway 등의 리소스를 CLI 명령어 한 번으로 배포가 가능하게 만들 수 있습니다.
- 로컬에서의 테스트
- 꼭 배포하지 않아도 로컬 환경에서 테스트가 가능합니다.
- AWS CloudFormation 기능을 이용한 단일 작업을 통한 리소스(인프라) 관리
- AWS CloudFormation은 이후에 배우게 될 Terraform과 같은 Infrastructure as Code 도구입니다
SAM 대안
serverless 범용성이 좀 더 좋다 멀티 클라우드에
terraform 사용할 수 있지만 서버리스위한 툴은아님
sam으로 기본적인 Hello World 애플리케이션 배포
SAM 설치(Mac)
1. SAM 설치 전 사전 조건
- AWS 계정 생성
- IAM 권한 및 AWS 자격 증명
터미널에 AWS configure를 친후 IAM에서 발급받은 aws 인증키를 입력해줘서 인증해줘야함 - docker 설치
- homebrew 설치
- aws sam cli 설치
brew install aws-sam-cli
설치 후 잘 깔려있는지 확인
sam --version
HelloWorld 출력하는 애플리케이션 배포
잠깐 !! 본격적인 서버리스 배포 전에 Lambda에 대한 적절한 권한을 추가해 주어야 한다.
Sprint1) API Gateway를 활용한 서버리스 애플리케이션 배포
Step 1: API Gateway - Lambda 배포 Instruction
- git clone 하기
git clone https://github.com/aws-samples/serverless-patterns/
cd serverless-patterns/lambda-dynamodb
- 현재 람다가 런타임 node 14.x를 지원하므로 template.yaml 파일 수정
Runtime: node.js14.x
- 변경사항 sam build
- sam 으로 배포
sam deploy --guided
잘 동작 하는지 확인
202 state가 도착하면 성공!
STEP 2: API 게이트웨이 - Lambda
1. 트리거 추가 버튼을 누른다
2. 추가 트리거에서 다음 옵션을 통해 API 게이트웨이를 생성한다.
- API 게이트웨이를 선택
- 새 API를 생성
- REST API 유형
- 보안은 "열기"
3. 이제 API 엔드포인트에 HTTP 요청을 보내면, 함수를 호출할 수 있다. 요청의 상세 내용이 DynamoDB에 저장된다.
STEP 3: API 게이트웨이에 제한 추가하기
- Post 전용으로만 작동하게 만들기
> API 게이트웨이 부분을 클릭해 게이트웨이 탭으로 들어간다
> 왼쪽에 리소스를 클릭 -> 작업 클릭 -> 메서드 생성
> 박스에 원하는 메서드 선택하고 체크 표시 클릭
> 작업 메뉴에서 API 배포 클릭
> POST 클릭 -> 테스트 클릭
> 요청 본문에 JSON 적기
> DynamoDB 콘솔로 이동 -> 왼쪽 탭 항목 탐색 -> 데이터가 추가된 것을 확인할 수 있음
- 본문만 저장하도록 만들기
- API 키를 이용한 인증 추가하기
순서
1. apigateway -> API 키 클릭
2. 작업 -> API 키 생성 클릭
3. 이름: 아무거나, API 키: 자동 생성 한 후 -> 저장
4.
5. 왼쪽 탭 사용량 계획 -> 생성
6. 리소스 -> POST 메서드 클릭 -> 메서드 요청 클릭
7. API 키가 필요함 -> true로 설정 후 저장
8. API 키 표시 클릭
9. postman에 헤더 x-api-key 벨류 값으로 생성된 apikey 입력 후 테스트
> x-api-key 쓰는 이유: 인증보다는 Throttling 목적으로 생성되는 것이 일반적
> Throttling: API 요청에 속도와 횟수를 제한하는 것
10. 추가된 것을 알 수 있다
- 권한 부여자를 이용한 인증 부여하기
1. 함수생성
2. 함수값 입력
// A simple token-based authorizer example to demonstrate how to use an authorization token
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke
// the request if the token value is 'deny'. If the token value is 'unauthorized' or an empty
// string, the authorizer function returns an HTTP 401 status code. For any other token value,
// the authorizer returns an HTTP 500 status code.
// Note that token values are case-sensitive.
exports.handler = function(event, context, callback) {
var token = event.authorizationToken;
switch (token) {
case 'allow':
callback(null, generatePolicy('user', 'Allow', event.methodArn));
break;
case 'deny':
callback(null, generatePolicy('user', 'Deny', event.methodArn));
break;
case 'unauthorized':
callback("Unauthorized"); // Return a 401 Unauthorized response
break;
default:
callback("Error: Invalid token"); // Return a 500 Invalid token response
}
};
// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
var authResponse = {};
authResponse.principalId = principalId;
if (effect && resource) {
var policyDocument = {};
policyDocument.Version = '2012-10-17';
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = 'execute-api:Invoke';
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
}
// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
"stringKey": "stringval",
"numberKey": 123,
"booleanKey": true
};
return authResponse;
}
3. API 게이트웨이로 이동
4. 권한부여자 -> 생성
> 토큰 형식에 토큰 소스로 'authorizationToken'입력 후 생성
5. test값에 allow 입력하여 응답 코드 200이 나오면 테스트성공
6. 리소스에 메소드 요청 클릭
7. 승인에 권한부여자 이름 입력
8. API 배포 클릭
9. 포스트맨 헤더 값에 키는 authorizationToken, 값은 allow입력 후 send -> 200나오면 성공
'DevOps BootCamp > 마이크로서비스' 카테고리의 다른 글
서버리스 사진첩 (0) | 2023.05.11 |
---|---|
API Gateway (1) | 2023.05.09 |
AWS Lambda (0) | 2023.05.09 |
CQRS (0) | 2023.05.08 |
메시지 브로커를 이용한 비동기식 통신 (0) | 2023.05.08 |