やりたいこと
samで構築されるリソースを各環境(dev/prod)ごとに分けたい。
環境別に分ける方法
- samconfig.tomlを環境別に分けて記述する。
- template.yamlにパラメータとして環境情報を渡して、環境別に各リソース名を切り替える
構築するリソース
- S3
- Lambda
- DynamoDB
template.yaml
Parametersで外部から環境情報を渡せるようにし、各リソース名を環境ごとに切り替える。
※関連個所のみ記載
Parameters:
Env:
Type: String
AllowedValues:
- dev
- prod
Resources:
CreateThumbnailBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub create-thumbnail-test-${Env}
CreateThumbnailFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: create_thumbnail/
Handler: app.lambda_handler
Runtime: python3.9
FunctionName: !Sub create-thumbnail-${Env}
Architectures:
- x86_64
Environment:
Variables:
ENV: !Ref Env
Policies:
- DynamoDBCrudPolicy:
TableName: !Ref CreateThumbnailTable
Events:
S3Input:
Type: S3
Properties:
Bucket: !Ref CreateThumbnailBucket
Events: s3:ObjectCreated:*
Filter:
S3Key:
Rules:
- Name: prefix
Value: input/
CreateThumbnailTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: !Sub create-thumbnail-${Env}
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: id
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
環境変数を使用することで、Lambda処理内で環境の判別が可能となる。
Environment:
Variables:
ENV: !Ref Env
Lambda(Python)では設定した環境変数を以下で取得できる。
os.environ['ENV']
samconfig.toml
環境ごとにデプロイ情報を記述。
parameter_overridesの設定値が、template.yamlのParametersに渡される。
version = 0.1
[dev]
[dev.deploy]
[dev.deploy.parameters]
stack_name = "sam-app-dev"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxx"
s3_prefix = "sam-app-dev"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
image_repositories = []
parameter_overrides = [
"Env=dev"
]
[prod]
[prod.deploy]
[prod.deploy.parameters]
stack_name = "sam-app-prod"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-xxxxxx"
s3_prefix = "sam-app-prod"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
image_repositories = []
parameter_overrides = [
"Env=prod"
]
デプロイ方法
dev
sam deploy --config-env dev
prod
sam deploy --config-env prod
ローカル実行時に環境変数を設定
環境変数ファイルを作成
{
"CreateThumbnailFunction" :{
"ENV": "dev"
}
}
作成したファイルを--env-varsで指定して実行
sam local invoke --config-env dev