AWS SAM CLI에서 여러 구성 구분
16585 단어 AWSaws-sam-cli
이 업데이트에 따라 지금까지 번거로웠던 여러 설정의 구분 사용이 수월해졌기 때문에 소개해 드리겠습니다.
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
참고 자료
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
$ 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
$ 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!"
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
(出力なし)
다음은 본론.
SAM CLI
samconfig.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
참고 자료
$ brew upgrade aws-sam-cli
$ sam --version
1.3.0
app
└── template.yaml
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
# dev デプロイ時
$ sam deploy --guided --config-env dev
Stack Name [sam-app]: sample-dev
...
Parameter EnvType []: dev # EnvType パラメータに env 名を入力しておきます
...(アップデート前と同じ質問)
SAM configuration file [samconfig.toml]: # コンフィグの保存名
SAM configuration environment [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]:
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"
$ aws cloudformation delete-stack --stack-name sample-dev
$ aws cloudformation delete-stack --stack-name sample-prod
Reference
이 문제에 관하여(AWS SAM CLI에서 여러 구성 구분), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/thamaa/items/2578d60d740fc146b69b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)