🙄

AWS SAM で環境差分を設定する

2023/06/27に公開

前回、CodePipelineを用いて、資材をデプロイしました。その際に環境の差分を考えずに作成したため、様々なリソースが同じ名前になってしまいました。

https://zenn.dev/gami113/articles/70863f0a97b728

今回は環境毎に異なるパラメータを設定し、環境差分を作成していきます。

環境差分をパラメータに切り出し、オーバーライドする

環境差分を設ける方法はいろいろあると思うのですが、今回は、パラメータをオーバーライドすることで、環境に応じてパラメータを変更する方法を取ります。

環境差分をパラメータを切り出す

環境差分としたいパラメータを、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