#1. API Gateway - Lambda 배포
1. Lambdda 함수와 API Gateway 세팅을 위한 SAM 사용
=> SAM 이란 - Serverless Application Model 는 서버리스 어플리케이션을 빌드하는데 사용할 수 있는 오픈 소스 AWS 프레임워크
SAM setting (Lambda to DynamoDB)
https://serverlessland.com/patterns/lambda-dynamodb
#Download
git clone https://github.com/aws-samples/serverless-patterns/
cd serverless-patterns/lambda-dynamodb
#Deploy
sam deploy --guided
- template.yaml파일에서 Runtime 을 nodejs12.x 에서 nodejs14.x 로 변경하여 사용
(현재 람다가 nodejs 14.x를 지원)
- 컴퓨터에 node.js 런타임 설치
- sam build 를 통해 빌드가 되는지 확인
- sam deploy --guided 를 통해 배포 시도
=> Default 값 사용 & 이외 설정 모두 Yes 선택
=> sam deploy -g 명령 후 아래와 같이 Successfully 메시지가 뜨면 성공적인 배포가 완료 됐다는 것
- Lambda 및 DynamoDB에 생성된 리소스 확인 - 콘솔 접속
- 정상작동 확인 (명령어 사용) - Arn 부분 수정 - StatusCode 202 확인
aws lambda invoke --function-name {Lambda함수의Arn를입력} --invocation-type Event --payload '{ "Metadata": "Hello" }' response.json --cli-binary-format raw-in-base64-out
=> invoke = Lambda 함수 호출
=> invocation-type Event = 비동기식 함수 호출
=> payload = Lambda 함수에 입력으로 제공하려는 JSON (파일 경로로도 지정 가능)
=> Event 호출 유형의 경우 상태코드 202 리턴
2. API 게이트웨이 - Lambda
- Lambda -> 함수 -> 트리거 추가 -> 게이트웨이 생성 (아래 옵션)
- 생성된 트리거의 엔드포인트 접속하여 함수호출 - DynamoDB에 상세내용이 저장됨
3. API 게이트웨이에 제한 추가
3-1. POST 전용으로만 작동하게 만들기 (아래 링크 참고)
- API Gateway 내 생성된 API에서 작업 -> 메소드 생성 -> POST 생성
- API 수정 시 API 재배포 실시 (필자는 default 로 진행)
- POST MAN 을 이용하여 API Gateway 엔드포인트로 JSON 형태의 데이터 POST 메소드 실행
- 응답 확인 (200, OK! 면 정상)
=> DynamoDB 에서 요청 Body 내용 저장된것 확인
3-2. API 키를 이용한 인증 추가
- API 키 생성
- 사용량 계획 생성 & API 스테이지 추가
=> 각 api 키에서 1초당 최대 요청 가능 수 정의
- 다시 API 키에서 사용량 계획 추가
- 리소스 내 POST 메소드에서 API 키 필요 부분 true 수정 및 HTTP 요청 헤더 추가
- 생성했던 API 키를 이용해 POST MAN 으로 API키를 이용한 인증을 검증
=> 요청 헤더에 HTTP 요청에서 작성한 이름에 맞게 api 키를 같이 전송하여야 함
=> 200, ok! 확인
3-3. 권한 부여자를 이용한 인증 부여
- 참고링크
- Lambda 권한 부여자 인증 워크플로우
=> 클라이언트가 API Gateway 의 메서드를 호출하고 보유자 토큰이나 요청 파라미터 전달
=> API Gateway가 Lambda 권한 부여자 구성 확인 - 구성되어 있는 경우 API Gateway가 Lambda 함수 호출
=> Lambda 함수의 호출자 인증 (방법)
- OAuth 공급자를 호출하여 OAuth 액세스 토큰 받음
(OAuth (Open Authorization) : 외부 서비스에서도 인증을 가능하게 하고 그 서비스의 API를 이용하게 해주는 것 - 권한 인증)
- SAML 공급자를 호출하여 SAML assertion 을 받음
(SAML (Security Assertion Markup Language) : 네트워크를 통해 여러 컴퓨터에서 보안 자격 증명을 공유할 수
있도록 하는 공개 표준)
- 요청 파라미터 기반으로 IAM 정책을 생성
- 데이터 베이스에서 자격 증명을 가져옴
=> 호출 성공 시 Lambda 함수는 한 개 이상의 IAM 정책과 보안 주체 식별자를 포함하는 출력 객체를 반환하여 액세스 부여
=> API Gateway 가 정책을 평가
- 액세스가 거부되면 API Gateway는 적절한 HTTP 상태 코드 반환
- 액세스 허용 시 API Gateway가 메소드를 실행 - 캐싱 활성화의 경우 함수 재 호출 필요 없도록 함
- Lambda 권한 부여자 문서 내의 예제 순서를 참고하여 진행
- Lambda 함수 생성
- Lambda 함수 내 코드 수정
// 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.
export const 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;
}
- Lambda DynamoDB 함수에서 권한부여자 생성
=> Lambda 함수 추가 - 이전에 생성한 auth-func
- 생성 후 권한 부여자 테스트 -> allow 입력
=> 응답코드 200 확인
- 리소스에 토큰 권한 부여 - 안보일 경우 새로고침하면 보임 => 이후 작업 -> API 배포
- Postman 에서 권한 없이 요청
=> 권한 없음이 응답으로 옴 (상태코드 401)
- Postman 에서 권한 있이 요청
=> 정상 응답 확인 (상태코드 200)
- Curl 로 확인 => 상태코드 200 확인
curl -X POST 엔드포인트넣기 -H "x-api-key: API키 넣기" -H "Content-Type: application/json" -H "authrizationToken: allow"
**오류사항1
- curl: (6) Could not resolve host: 오류
- curl: (3) unmatched close brace/bracket in URL position 1 오류
==> 해결법 1: 따옴표 모양이 달라서 오류가 생겼음... 아래 사진 보면 기울어진 따옴표 사용 시 오류가 났음...
**오류사항2
- {"message":"Missing Authentication Token"}curl: (3) URL using bad/illegal format or missing URL
==> 해결법 2: 띄어쓰기 오류 ㅎㅎㅎ 다시 확인해보기
'클라우드 > AWS' 카테고리의 다른 글
AWS Burst 기능이란? (0) | 2023.03.03 |
---|---|
[Mac OS]서버리스 어플리케이션 (Lambda, API Gateway, S3, Thumbnail, 자동화, SNS 알림) (0) | 2023.02.07 |
[Mac OS]AWS Certificate Manager, Route53, CloudFront (AWS ACM, ACM 인증서, Route 53) (0) | 2023.01.25 |
[Mac OS]ECS exec format error (ECR, ECS 오류, task, cluster) (0) | 2023.01.25 |
[Mac OS]AWS ECS를 이용한 컨테이너화 된 앱 배포(WAS, AWS ECR, AWS ECS) (1) | 2023.01.20 |