2020/11/03

AWS CodeBuildでビルド時に環境変数を設定する

この記事ではCodeBuildでビルド時に環境変数を設定する方法を解説していきます。機密性の高い環境変数の設定までできるようになります。CodeBuildでビルド時に環境変数を設定する方法が分からない方、AWS認定試験を受けようとしている方必見です!

CodeBuildを使用したことがないという方やCodeBuild上にまでプロジェクトを作成していないという方はこちらの記事もご覧ください!

デフォルトの状態の環境変数を確認する

まず自分で環境変数を設定する前にデフォルトの状態でどのような環境変数が設定されているかを確認してみましょう。

CodeBuildでビルドする際のコマンド等を定義するbuildspec.ymlファイル内で、printenvコマンドを指定します。

※自分のbuildspec.ymlファイルは以下のようになっています。

version: 0.2

phases: 
    install:
        runtime-versions:
            nodejs: 10
        commands:
            - printenv
            - echo "installing something"
    pre_build:
        commands: 
            - echo "we are in the pre build phase"
    build:
        commands:
            - echo "we are in the build block"
            - echo "we will run some tests"
    post_build:
        commands:
            - echo "we are in the post build phase"

変更したbuildspec.ymlファイルをソースコードに含めたら、該当のCodeBuildプロジェクトを開始してみましょう。

デフォルトの状態でもいくつか環境変数が設定されていることがわかります。

CodeBuildデフォルト環境変数出力

環境変数を設定する

では実際に環境変数を設定していきます。

ここではDBパスワード等の機密性の高い環境変数の設定についても説明していきます。

まずはCodeBuildコンソール画面から該当のビルドプロジェクトに遷移し、「ビルドの開始」ボタンをクリックします。ビルドの開始画面に遷移したら、「環境変数の上書き」セクションにいきましょう。

このセクションで環境変数を定義していきます。

「名前」フォームには環境変数名を入力します。

「タイプ」では環境変数のタイプを選択します。「プレーンテキスト」、「パラメータ」、「Secrets Manager」の3種類から選択できる(2020/11/03時点)ようになっていると思います。

プレーンテキストは特に機密性がない環境変数を設定する際に使用します。プレーンテキストを選択した際は「値」フォームにそのまま環境変数の値を入力します。

Secrets ManagerはAWS Secrets Managerというサービスを使用して環境変数を管理する方法です。機密性が高く、API認証情報やデータベース認証情報などのトップシークレットな値をローテーションしながら管理したい時に使用します。

パラメータはAWS Systems Managerの1サービスであるパラメータストアを使用して環境変数を管理する方法です。パラメータストアでは通常の文字列を設定することもできれば、機密性の高い値に関してはAWS KMSを使用して暗号化した状態で文字列を設定することもできます。パラメータストアをタイプに選択した場合はパラメータストアで作成したパラメータの名前を「値」フォームに入力します(作成方法は後ほど説明)。

環境変数の上書き

今回は説明用にプレーンテキストの環境変数とパラメータの環境変数を設定してみましょう。

プレーンテキストの環境変数はそのままCodeBuild上のフォームに入力するだけなので、パラメータの環境変数の設定方法についてここから解説していきます。

パラメータを作成する

AWS Systems Manager パラメータストアのコンソール画面に遷移し、「パラメータの作成」ボタンをクリックします。

Systems Manager パラメータストア

「名前」フォームではパラメータの名前を入力します。後にCodeBuildの環境変数の上書きセクションではここで設定した名前を入力します。

「利用枠」では「標準」と「詳細」が選択できます。設定するパラメータの文字列の長さが極端に長い場合や、10,000以上のパラメータを作成した場合などはこちらの「詳細」を選択します。「詳細」の場合はパラメータごとに課金が発生するようです。

特別理由がなければ利用枠は「標準」を選択しましょう。

「タイプ」ではパラメータのタイプを選択します。特に機密性の高い情報でなければ「文字列」を、複数の文字列をリスト形式で設定したい場合は「文字列のリスト」を、機密性の高い文字列の場合は「安全な文字列」を選択します。「安全な文字列」を選択した場合は、KMSを使用して暗号化がされるようです。今回は機密性の高い情報を格納するので、「安全な文字列」を選択します。

「KMSキーソース」ではKMSを用いて暗号化する際に、どのAWSアカウントのKMSキーを使用するかどうかを選択します。特に理由がなければ「現在のアカウント」を選択しましょう。

「KMSキー」は使用するKMSのキーを選択します。

「値」にはパラメータの値を入力しましょう。

一通り入力が完了したら「パラメータを作成」ボタンをクリックします。

パラメータを作成

パラメータの作成が完了しました!

パラメータ作成完了

IAMロールを設定する

このままではCodeBuildから設定したパラメータを読みこめないため、IAMロールの設定をしていきます。

IAMロールのコンソール画面に遷移し、「ロールの作成」ボタンをクリックしましょう。

IAMロール作成

ロール作成画面が表示されたら、「 信頼されたエンティティの種類を選択」セクションでは「AWSサービス」を選択します。「ユースケースの選択」では「CodeBuild」を選択します。

信頼されたエンティティの種類・ユースケースの選択

CodeBuildを選択すると画面の下の方に「ユースケースの選択」セクションが再度表示されるので、こちらでも「CodeBuild」を選択します。選択できたら「次のステップ : アクセス権限」ボタンをクリックしましょう。

ユースケースの選択

Attach アクセス権限ポリシー画面が表示されたら、フィルターで「ssm」と検索し、「AmazonSSMReadOnlyAccess」にチェックを入れ、「次のステップ : タグ」ボタンをクリックします。

CodeBuildからSystemsManagerのパラメータストアを読み取るという動作をするため、今回は読み取り専用の権限を付与しています。

アクセス権限ポリシー

タグの追加では特に何も設定せず、「次のステップ : 確認」ボタンをクリックしましょう。

タグの追加

確認画面が表示されたら、「ロール名」に作成するロール名(今回は「SSMReadOnlyAccess」)を入力します。

どんなロールか分かりやすいように任意で説明を入力しましょう。

入力が一通り完了したら「ロールの作成」ボタンをクリックします。

確認

環境変数を設定する

一通り設定が終わったので、ビルドの開始画面の「環境変数の上書き」セクションで作成したパラメータを設定していきます。タイプでパラメータを選択し、先ほど作成したパラメータ名を「値」フォームに入力します。

buildspec.ymlファイルでprintenvコマンドを実行して環境変数の値がビルドログに出力されるようにし、ビルドを開始していきましょう。

環境変数の上書き パラメータを設定

ビルドログを確認してみると設定した値が出力されていますね!!!

DB_PASSWORD

DB_URL

まとめ

ビルド時にアプリケーションで使用する環境変数の切り替えや一つのbuildspec.ymlファイルで環境ごとに異なるコマンドを実行するということもCodeBuildの環境変数の切り替えで実現ができそうですね!!