[CodeBuild]buildspec.ymlでの環境変数指定方法あれこれまとめ
コンニチハ、千葉です。
CodeBuildを利用する上で、変数を利用したい場面があります。ただ、この変数の指定方法は複数あるため、どの場面でどれ使ったら良いかという観点でまとめました。
変数の指定方法
2017年11月時点で3つの指定方法があります。
buildspec.ymlのvariablesで指定
buildspec.ymlのvariablesで指定します。こちらは、buildspec.yml内で共通で利用できる変数です。
version: 0.2 env: variables: key: "value" phases: build: commands: - echo $key
buildspec.ymlのparameter-storeで指定
buildspec.ymlのparameter-storeで指定します。こちらは、buildspec.yml内で共通で利用できる変数です。 ただし、この値はSystems Managerのパラメータストアから取得します。また、パラメータストアはKMSにより値を暗号化することができます。 パスワードやライセンスキーなど暗号化必要な場合はこちらを利用しましょう。
valueには、パラメータストアに登録した名前を指定します。例えば、パラメータストアでexampleという名前で値を登録したら、key: "example"という形で指定します。これを指定すると、Codebuildでパラーメタから値を取得し、複合化までしてくれます。ユーザーは、パラメータストアへの値を登録、buildspec.ymlで指定するだけで利用することができます。
version: 0.2 env: parameter-store: key: "value" phases: build: commands: - echo $key
CodeBuildプロジェクトの環境変数で指定
CodeBuildプロジェクトに対しても環境変数を登録することができます。こちらの利用用としては、環境固有の値を変数として保存することができます。例えば、開発/ステージング/本番環境で同じbuildspec.ymlを使うことができます。環境固有で変わるパラメータについては、こちらの環境変数を利用しましょう。
version: 0.2 phases: build: commands: - echo $key
また、環境変数はタイプが2つあり、プレーンテキスト、パラメータストアからの取得を選択できます。
やってみた
buildspec.ymlの作成
以下でbuildspec.ymlを作成し、GitHubにコミットしました
version: 0.2 env: variables: buildspec_yml_env: "This param is from buildspec.yml" parameter-store: parameter_store_env: "parameter_store_env" phases: build: commands: - echo buildspec_yml_env:${buildspec_yml_env} # envのvariablesで定義した値を取得 - echo parameter_store_env:${parameter_store_env} # envのparameter-store定義し、パラメータストアから暗号化された値を取得 - echo project_env:${project_env} # CodeBuildプロジェクトで定義した値を取得(プレーンテキスト) - echo parameter_store_env2:${parameter_store_env2} # CodeBuildプロジェクトで定義し、パラメータストアから暗号化された値を取得
Systems Managerのパラメータストアに値を定義(暗号化)
Systems Managerのパラメータストアに値を登録します。暗号化して保存しました。
CodeBuildプロジェクトで環境変数を設定
CodeBuildのプロジェクトの環境変数に値を登録します。プレーンテキストとパラメータストアの2タイプ登録しました。
CodeBuildで利用するIAMロールに権限を追加
CodeBuildでパラメータストアから値を取得し複合化するための権限を付与します。CodeBuildで利用するIAMロールに、以下のIAMポリシーを追加しましょう。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "ssm:GetParameters" ], "Resource": [ "arn:aws:ssm:ap-northeast-1:<account-id>:parameter/<パラメータストアの登録名>", ] }, { "Sid": "", "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "arn:aws:kms:ap-northeast-1:<account-id>:key/alias/aws/ss" ] } ] }
出力結果
ビルドを実行し、環境変数が取得できるか確認しました。
[Container] 2017/11/16 14:42:49 Running command echo buildspec_yml_env:${buildspec_yml_env} buildspec_yml_env:This param is from buildspec.yml [Container] 2017/11/16 14:42:49 Running command echo parameter_store_env:${parameter_store_env} parameter_store_env:This param is from paramater store. [Container] 2017/11/16 14:42:49 Running command echo parameter_store_env2:${parameter_store_env2} parameter_store_env2:This param is from paramater store2. [Container] 2017/11/16 14:42:49 Running command echo project_env:${project_env} project_env:This param is from codebuild project
ちゃんと想定した通りに取得できてますね。
最後に
CodeBuildでの変数の指定方法を試してみました。buildspec.ymlに記載する方法、CodeBuildプロジェクトに登録する方法、パラメータストアを利用した暗号化する方法、それぞれ適宜使い分けていきましょう。