AWS SAM で環境差分を設定する
前回、CodePipelineを用いて、資材をデプロイしました。その際に環境の差分を考えずに作成したため、様々なリソースが同じ名前になってしまいました。
今回は環境毎に異なるパラメータを設定し、環境差分を作成していきます。
環境差分をパラメータに切り出し、オーバーライドする
環境差分を設ける方法はいろいろあると思うのですが、今回は、パラメータをオーバーライドすることで、環境に応じてパラメータを変更する方法を取ります。
環境差分をパラメータを切り出す
環境差分としたいパラメータを、Parametersに切り出していきます。Domainsにかかわる部分を切り出しました。
パラメータをオーバーライドする
sam deploy
を実行する際に、引数としてパラメータをオーバーライドする方法などがありますが、今回は samconfig.toml に設定を加えていきます。ローカルでビルド、および、デプロイを実施していきます。この際に各パラメータについて聞かれるため、設定を加えていきます。
PS E:\prog\sam-hello-world> sam build
PS E:\prog\sam-hello-world> sam deploy --config-env env --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: hello-world-env
AWS Region [ap-northeast-1]:
Parameter ApiName [sam-hello-world]: hello-world-env
Parameter ApiStageName [stage]: env
Parameter ApiDomainName []: api.example.com
Parameter ApiCertificationArn []: certArn
Parameter ApiEndpointConfiguration [EDGE]:
Parameter ApiHostedZoneId []: XXXXXXXXXX
#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]:
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]:
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]:
SAM configuration file [samconfig.toml]:
SAM configuration environment [env]:
Looking for resources needed for deployment:
パラメータの設定が完了すれば、samconfig.tomlに下記のように設定が加わります。これを環境ごとに実施します。
[env.deploy.parameters]
stack_name = "hello-world-env"
resolve_s3 = true
s3_prefix = "hello-world-env"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
parameter_overrides = "ApiName=\"hello-world-env\" ApiStageName=\"env\" ApiDomainName=\"api.example.com\" ApiCertificationArn=\"certArn\" ApiEndpointConfiguration=\"EDGE\" ApiHostedZoneId=\"XXXXXXXXXX\""
image_repositories = []
すべての資材のデプロイが完了したら、API GatewayのAPIの一覧を確認します。環境毎に名前が変わっていることが確認できます。
CodePipelineでのデプロイにて、環境差分を反映する
CodePipelineでも環境差分がデプロイできるように、ファイルを修正していきます。
codepipeline.yaml
環境変数に--config-env
で指定するパラメータを設定する。
pipeline/buildspec_build_package.yml
samconfig.tomlもartifactsに含める。
pipeline/buildspec_deploy.yml
ビルド時に環境変数のパラメータを含める。
これらの変更をコミットし、CodePipelineが正常終了すれば、作業終了です。
まとめ
今回の作業で、上手く環境差分を作成することに成功しました。また、パラメータを外に切り出したことで、yamlファイルに環境固有の情報が乗りにくいというメリットもあると感じました。設定ファイルをgit外で管理しs3に配置して参照する等すれば、git管理と切り離すことも出来ます。上手く使っていきたいです。
次回以降
ひとまず、SAMについて試したいことは試すことが出来たと思います。次回からは、AWS上でデータを取りまとめることを考えます。
Discussion