AWS SAM CLI에서 여러 구성 구분

16585 단어 AWSaws-sam-cli
며칠 전에 AWS SAM CLIv1.3.0 출시가 만들어 다중 구성이 지원되었습니다.
이 업데이트에 따라 지금까지 번거로웠던 여러 설정의 구분 사용이 수월해졌기 때문에 소개해 드리겠습니다.
AWS SAM CLI 를 간단히 복습한 다음 업데이트 전후의 변경 사항을 살펴봅니다.

AWS SAM 및 AWS SAM CLI


AWS SAM(Serverless Application Model)은 서버 애플리케이션을 구축하는 데 사용되는 프레임워크입니다.
확장CloudFormation 템플릿의 SAM 구문을 사용하여 템플릿을 설명함으로써 구조를 간단하게 정의할 수 있습니다.
예를 들어 API Gateway와 Lambda의 간단한 응용 프로그램이라면 이렇게 많은 줄만 쓸 수 있다.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  SampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.lambda_handler
      Runtime: python3.7
      InlineCode: |
        import json

        def lambda_handler(event, context):
            return {
                'statusCode': 200,
                'body': json.dumps('Hello world!')
            }
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /helloworld
            Method: get
AWS SAM CLI는 AWS에 대한 디버깅, 로컬에서의 실행, 테스트 등을 수행할 수 있는 SAM 기반 애플리케이션을 지원하는 CLI 도구입니다.
그러면 SAM CLI 를 사용하여 위의 애플리케이션을 디버깅하십시오.
템플릿이 template.yaml 이름으로 저장되면 이 명령을 실행합니다.
$ sam --version
SAM CLI, version 1.2.0
$ sam deploy --guided
많이 물어볼 테니까 대답해.
Stack Name [sam-app]: helloworld         # 任意のスタック名を入力
AWS Region [us-east-1]: us-west-2        # 任意のリージョンを入力
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]: y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]:
SampleFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to samconfig.toml [Y/n]:  # 設定をコンフィグファイルに保存するか

...

Deploy this changeset? [y/N]: y
CloudFormation 콘솔을 열면 스택이 생성됩니다.

생성된 API를 실행합니다.
다음 명령은 스택 이름에서 API Gateway의 자원 ID를 조사하고 엔드포인트 URL을 조립하여 curl로 요청한 것입니다.
$ aws cloudformation describe-stack-resources \
--stack-name helloworld \
--query 'StackResources[?ResourceType==`AWS::ApiGateway::RestApi`].PhysicalResourceId' \
--output text \
 | xargs -IX curl https://X.execute-api.us-west-2.amazonaws.com/Prod/helloworld
"Hello world!"
잘 돌아가고 있어!
따라서 SAM CLI 를 사용하면 애플리케이션을 손쉽게 만들 수 있습니다.
제목과 관련된 것은 방금 실행 sam deploy --guided 했을 때 설정 파일 samconfig.toml 에 depro를 저장할 때의 설정입니다.
이 파일이 있기 때문에 다음부터는 sam deploy만 디버깅을 할 수 있지만 이후 설명한 바와 같이 지금까지 사용하기 어려운 부분이 있다.
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "helloworld"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxxx"
s3_prefix = "helloworld"
region = "us-west-2"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
다음 단계에 앞서 이미 개발된 자원을 취소합니다.
$ aws cloudformation delete-stack --stack-name helloworld
(出力なし)

-- config-env 옵션을 실행하기 전에


다음은 본론.
SAM CLIsamconfig.toml를 사용하면 설정을 저장할 수 있지만 동일한 템플릿을 사용하여 매개 변수만 변경하여 여러 디버깅을 수행하고 각각의 구성을 유지하는 방법은 간단히 구현되지 않습니다.
템플릿 파일과 같은 곳에서 찾기 samconfig.toml, samconfig.toml 에는 설정 하나만 저장할 수 있고 samconfig.toml 이외의 이름으로 저장할 수 없기 때문이다.
따라서 저는 다음과 같은 디렉터리를 구분해서 여러 개의 설정을 구분합니다. (예를 들어 개발용 dev와 공식용prod입니다.)
우선 공통template.yaml과 서로 다른 환경의 목록을 준비한다.
app
├── dev
│   └── (empty)
├── prod
│   └── (empty)
└── template.yaml
디버그 시 template.yaml를 각 환경의 디렉터리sam deploy에 복사합니다.
# dev デプロイ時
$ cp template.yaml app/dev
$ cd app/dev
$ sam deploy --guided

# prod デプロイ時
$ cp template.yaml app/prod
$ cd app/prod
$ sam deploy --guided
이렇게 하면 여러 개의 설정을 구분해서 사용할 수 있는 디렉터리samconfig.toml를 만들 수 있다.
그런데 워낙 쉬워서 조금 복잡해져서 귀찮았어요.
app
├── dev
│   └── samconfig.toml
├── prod
│   └── samconfig.toml
└── template.yaml

-- config-env 옵션 사용


상술한 여러 단구의 사용 구분은 매우 간단해졌다.
먼저 SAM CLI를 v1로 설정합니다.3.0.
$ brew upgrade aws-sam-cli
$ sam --version
1.3.0
템플릿 파일을 준비합니다.
app
└── template.yaml
여러 구성으로 전환되었는지 확인하기 위해 방금 내용을 조금 변경EnvType한 부분).
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Parameters:
  EnvType:
    Type: String
Resources:
  SampleFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.lambda_handler
      Runtime: python3.7
      InlineCode: |
        import os
        import json

        def lambda_handler(event, context):
            return {
                'statusCode': 200,
                'body': json.dumps(os.environ.get('ENV_TYPE'))
            }
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /envtype
            Method: get
      Environment:
        Variables:
          ENV_TYPE: !Ref EnvType
--config-env 디버깅을 위한 옵션을 지정합니다.
# dev デプロイ時
$ sam deploy --guided --config-env dev
아까와 마찬가지로 질문을 받았지만 마지막 질문에서 설정할 환경 이름을 지정할 수 있습니다. (옵션에서 지정한 dev 는 기본값입니다.
Stack Name [sam-app]: sample-dev
...
Parameter EnvType []: dev                  # EnvType パラメータに env 名を入力しておきます

...(アップデート前と同じ質問)

SAM configuration file [samconfig.toml]:   # コンフィグの保存名
SAM configuration environment [dev]:       # コンフィグの環境名 ← こっちが重要
제작창고에 보관된samconfig.toml를보면방금[default]부분이[dev]로 바뀌었다.
version = 0.1
[dev]
[dev.deploy]
[dev.deploy.parameters]
stack_name = "sample-dev"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxxx"
s3_prefix = "sample-dev"
region = "us-west-2"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
parameter_overrides = "EnvType=\"dev\""
제품 설정을 계속합니다.
# prod デプロイ時
$ sam deploy --guided --config-env prod
Stack Name [sam-app]: sample-prod
...
Parameter EnvType []: prod                 # 今度は prod を入力しておきます

...(アップデート前と同じ質問)

SAM configuration file [samconfig.toml]:
SAM configuration environment [prod]:
끝부분에 [prod]구역이 추가되었습니다.
version = 0.1
[dev]
[dev.deploy]
[dev.deploy.parameters]
stack_name = "sample-dev"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxxx"
s3_prefix = "sample-dev"
region = "us-west-2"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
parameter_overrides = "EnvType=\"dev\""

[prod]
[prod.deploy]
[prod.deploy.parameters]
stack_name = "sample-prod"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxxxxxxxxx"
s3_prefix = "sample-prod"
region = "us-west-2"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
parameter_overrides = "EnvType=\"prod\""
동작을 확인하다.
$ aws cloudformation describe-stack-resources \
--stack-name sample-dev \
--query 'StackResources[?ResourceType==`AWS::ApiGateway::RestApi`].PhysicalResourceId' \
--output text \
 | xargs -IX curl https://X.execute-api.us-west-2.amazonaws.com/Prod/envtype
"dev"

$ aws cloudformation describe-stack-resources \
--stack-name sample-prod \
--query 'StackResources[?ResourceType==`AWS::ApiGateway::RestApi`].PhysicalResourceId' \
--output text \
 | xargs -IX curl https://X.execute-api.us-west-2.amazonaws.com/Prod/envtype
"prod"
dev와prod가 모두 개발되었음을 확인했습니다. 창고 파라미터가 지정한 EnvType 이 정상적으로 반영되었습니다.
마지막으로 창고부터 삭제합시다.
$ aws cloudformation delete-stack --stack-name sample-dev
$ aws cloudformation delete-stack --stack-name sample-prod

참고 자료

  • AWS Serverless Application Model(SAM) 명령줄 인터페이스로컬 구축, 테스트 및 서버 어플리케이션 디버깅: https://aws.amazon.com/jp/blogs/news/aws-serverless-application-model-sam-command-line-interface-build-test-and-debug-serverless-apps-locally/
  • AWS SAM CLI: https://github.com/aws/aws-sam-cli
  • Release 1.3.0: https://github.com/aws/aws-sam-cli/releases/tag/v1.3.0
  • --config-env의 Proposical: https://github.com/aws/aws-sam-cli/issues/1615
  • 좋은 웹페이지 즐겨찾기