ECSタスクへの機密情報の環境変数の設定


概要

Twelve-Factor Appでも述べられているように、アプリケーションの設定は環境変数にしておいた方が色々と取り回しが効きやすいです。
問題は、パスワードなどの機密情報をどう管理してどうデプロイするかにあります。
AWSとECSには機密情報を環境変数として管理する問題を解決するサービスと機能が存在します。
その利用方法を解説します。

アーキテクチャ

環境変数を AWS Systems Managerパラメータストア で管理します。
ECSタスク定義は docker-compose を利用します。
ECSとパラメータストアを連携させて環境変数を埋め込みます。

環境変数管理

環境変数はGithubやGitlabで設定できる機能もありますが、AWSを使っているのであれば Systems Managerパラメータストア を使うのが便利です。

理由としては以下が挙げられます。

  • 機密情報管理とECSへの展開が容易でセキュア
  • S3のようなパスで値を管理できる
  • IAMポリシーを使ってアクセス制限をかけられる

機密情報以外の環境変数設定方法

AWS Systems Manager > パラメータストア 画面を開くと パラメータの作成 ボタンがあるのでそれを実行します。

作成画面が開くので、各項目を埋めていきます。

項目 説明
名前 パス形式で環境変数名を設定します
パスの先頭とかどこかに環境名(dev/stg/prdなど)を入れておくと良いです
説明 説明を記入します。入力なしでも問題ないです
利用枠 通常は 標準 で問題ありません。詳細を使う場合はよく説明を読んで下さい
タイプ 通常の利用の場合は 文字列 を選択します。機密情報を利用する場合は 安全な文字列 を選択します
データ型 通常の利用の場合は text で十分だと思います。詳細はAWSドキュメントを参照してください
環境変数に設定する値を入力します

各項目を入力して パラメータを作成 を実行するとパラメータが作成されます。

機密情報の環境変数

パラメータを作成画面で項目 タイプ安全な文字列 を指定します。

項目 説明
KMSキーソース 暗号化復号化のためのKMSキーのソースを指定
KMSキーID 使用するKMSキーIDを指定

通常は 現在のアカウント のデフォルトのKMSキーIDで問題ないと思います。
各項目を入力して パラメータを作成 を実行するとパラメータが作成されます。

機密情報をECSタスク定義に設定する

docker-compose形式でタスク定義する場合、

  • docker-compose.yml
  • ecs_params.yml

の2つのファイルを用意します。
docker-compose形式を使ったタスク定義などに関しては以前書いた記事などを参照してください。
docker-compose.ymlには機密情報の環境変数は設定しません。
機密情報の環境変数は ecs_params.yml に設定します。

docker-compose.yml
version: '3'
services:
  app:
    image: nginx
    ports:
      - "80:80"
:
#機密情報の環境変数は設定しない
ecs_params.yml
version: 1
task_definition:
  services:
    app:
:
      # ここで機密情報の環境変数を設定
      secrets:
        # value_fromにパラメータストアで設定した環境変数名を設定
        - value_from: /dev/DB_USER
          # nameにアプリケーションで参照する環境変数名を設定
          name: DB_USER
        - value_from: /dev/DB_PASSWORD
          name: DB_PASSWORD
:

secrets に機密情報の環境変数を設定します。
value_from にパラメータストアで設定した環境変数名を設定します。
name にアプリケーションで参照する環境変数名を設定します。

まとめ

パスワードなどの環境変数として埋め込む機密情報の管理は厄介な問題でしたが、AWSを利用している場合は簡単に解決できます。
また、PEMファイルなどの認証鍵もbase64エンコードしてパラメータストアに登録しておくことで、ファイルとしてサーバやコンテナに置いておく必要がなくなります。
こういうときにクラウドサービスはすごい便利だと感じます。
パラメータストアを是非活用してみてください。