클라우드/AWS

[Mac OS]API Gataway 와 서버리스 어플리케이션

chanstory 2023. 2. 4. 22:10
반응형

#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

 

Serverless Land

Your resource for learning serverless technology.

serverlessland.com

#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 전용으로만 작동하게 만들기 (아래 링크 참고)

https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/api-gateway-create-api-from-example.html

 

자습서: 예제를 가져와 REST API 생성 - Amazon API Gateway

자습서: 예제를 가져와 REST API 생성 Amazon API Gateway 콘솔을 사용하여 PetStore 웹 사이트에 대한 HTTP 통합으로 간단한 REST API를 생성 및 테스트할 수 있습니다. API 정의는 OpenAPI 2.0 파일로 미리 구성되

docs.aws.amazon.com

 

 

- 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. 권한 부여자를 이용한 인증 부여

- 참고링크

https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html

 

API Gateway Lambda 권한 부여자 사용 - Amazon API Gateway

프로덕션 코드에서는 권한 부여를 허용하기 전에 사용자를 인증해야 할 수 있습니다. 이 경우, 해당 공급자의 설명서에서 설명한 대로 인증 공급자를 호출하여 Lambda 함수에 인증 로직을 추가할

docs.aws.amazon.com

 

- 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: 띄어쓰기 오류 ㅎㅎㅎ 다시 확인해보기

                               

            

 

 

반응형