Serverless로 독자 도메인 적용 + Lambda에 여러가지 정리해 배포

서버리스 애플리케이션을 배포할 때 여러가지 빠졌기 때문에 메모.
이전에 프론트 배포에 대한 메모 을 썼습니다만, 이번은 백엔드편입니다.

하고 싶은 것 (최종 구성)



다음과 같이 람다에서 실행되는 애플리케이션을 AWS에 배포하기 위해,
필요한 구성 파일을 만듭니다.


전제



· 자신의 도메인과 인증서가 이미 획득되었습니다.
· node.js 및 Serverless Framework가 설치되었습니다.

절차



대략적인 절차는 다음과 같습니다.
-Serverless.yml 설정
1. API 기본 경로 매핑
2.Function 및 대응하는 API의 기술
3.DynamoDB 지정
4.Cognito 명세

- 최초 배포 전 필요한 작업
1. AWS 계정 인증
2.create_domain

좀 더 자세히 써 갑니다.

serverless.yml 설정



1.API 베이스 패스 매핑(custom:area)



아래와 같이 custom: 에리어에 필요한 정보를 기재한다.
basePath에 API 콜할 때의 베이스가 되는 도메인을 기재.
(API는 https://[api.domain.name]/[bathPath]/***의 형태로 호출된다)

serverless.yml
service: [service-name]

provider:
  name: aws
  runtime: go1.x
  stage: ${opt:stage, env:STAGE, 'dev'}
  region: ${opt:region, env:REGION, '[region]'}

plugins:
  - serverless-domain-manager

custom:
  customDomain:
    domainName: [api.domain.name]
    stage: ${self:provider.stage}
    basePath: '[basePath_name]'
    certificateName: '[*.api.domain.name]'
    createRoute53Record: true

2.Function과 대응하는 API의 기술(functions:area)



이하와 같이 대응하는 Function을 기술해 간다.
(API는 https://[api.domain.name]/[bathPath]/[api_name]의 형태로 호출된다)

serverless.yml
service: [service-name]

functions:
  Function_name:
    handler: bin/[Functionのmain.goが配置されたフォルダ名]
    events:
      - http:
          path: /[api_name]
          method: post
          cors: true

3.DynamoDB의 지정(environment: 에어리어)



API 콜을 트리거로서 S3나 DynamoDB에 접속하고 싶은 경우, environment에 S3bucketName나 DynamoDB의 이름을 기재한다.
접속처가 CloudFormation을 이용해 만들어지고 있는 경우, "cf:"를 붙여 지정하는 것만으로 좋다.
참고 : Serverless Framework에서 CloudFormation 출력 값(Outputs) 참조

serverless.yml
service: [service-name]

provider:
  name: aws
  runtime: go1.x
  stage: ${opt:stage, env:STAGE, 'dev'}
  region: ${opt:region, env:REGION, '[region]'}
  environment:
    STAGE: ${self:provider.stage}
    REGION: ${self:provider.region}
    TABLE_NAME: ${cf:[スタック名].[テーブル名]}

4. 사용자 인증의 기술(custom:area, functions:area)



이번에는 AWS Cognito를 사용하여 사용자 인증을 수행하므로이 경우 authorizer 필드에
arn: COGNITO_USER_POOL_ARN을 지정한다.
CloudFormtaion을 사용하여 UserPool을 만드는 경우 다음과 같이 작성합니다.

serverless.yml
service: [service-name]

custom:
  authorizer:
    arn: arn:aws:cognito-idp:${self:provider.region}:99999999999:userpool/${cf:[スタック名].[UserPool名]}
    identitySource: method.request.header.Authorization
  customDomain:
    domainName: [api.domain.name]
    stage: ${self:provider.stage}
    basePath: '[basePath_name]'
    certificateName: '[*.api.domain.name]'
    createRoute53Record: true

functions:
  Function_name:
    handler: bin/[Functionのmain.goが配置されたフォルダ名]
    events:
      - http:
          path: /[api_name]
          method: post
          cors: true
          authorizer: ${self:custom.authorizer}

처음 배포하기 전에 필요한 작업



1. AWS 계정 인증



먼저 Serverless용 IAM 사용자를 만듭니다.
・Policy는 「AdministratorAccess」
・액세스의 종류는, 「프로그램에 의한 액세스」만 체크.
생성 후 표시되는 액세스 키 ID와 비밀 액세스 키를 이용하여 다음 명령을 실행합니다.
serverless config credentials --provider aws --profile serverless --key [アクセスキーID] --secret [シークレットアクセスキー]

create_domain



다음 기사를 참고하여 create_domain 명령을 실행합니다.
Serverless (node.js)에서 자체 도메인 SSL을 적용하는 방법

실행이 성공하면 사용자 지정 도메인 이름이 등록되어 있는지 확인할 수 있습니다.


이상!



sls deploy를 하면 배포됩니다.

참고



배포 성공 후 다음 CORS 오류가 발생하고 왜? ? ? 라고 생각했지만,
지정한 UserPool이 잘못되었기 때문입니다.
전혀 관계없는 HTTP 헤더의 세트 개소라든지 봐 버리고 있어 해결에 시간 걸렸습니다…
Access to XMLHttpRequest at 'https://api.domain.name/bath-path/function' from origin 'https://reqested.url' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

좋은 웹페이지 즐겨찾기