[CodeBuild]buildspec.ymlでの環境変数指定方法あれこれまとめ

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンニチハ、千葉です。

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プロジェクトに登録する方法、パラメータストアを利用した暗号化する方法、それぞれ適宜使い分けていきましょう。