AWS Systems Manager パラメータストアを使って、ECSのtaskで環境変数を安全に運用する方法

概要

DBのパスワードとかの機密情報をECSのtask実行時の環境変数に入れたい場合、AWS Systems Manager パラメータストアを使うとかんたん&安全

AWS Systems Manager パラメータストア is 何?

AWS Systems Manager パラメータストア は、設定データ管理と機密管理のための安全な階層型ストレージを提供します。パスワード、データベース文字列、ライセンスコードなどのデータをパラメータ値として保存することができます。値はプレーンテキストまたは暗号化されたデータとして保存できます。

ポイント

  • 値を暗号化して保管できる(暗号化はEKSで行われる)
  • APIを使って復号化した値を取得することができる

環境変数とかにパスワードとか入れたい時に便利!

AWS Secrets Manager シークレット というサービスもある

AWSで機密情報を扱いたい時にはどちらかを使えと公式ドキュメントにかかれている

機密データの指定 - Amazon ECS

Amazon ECS を使用すると、AWS Secrets Manager シークレットまたは AWS Systems Manager パラメータストアのパラメータに機密データを保存してコンテナの定義でそれを参照することによって、コンテナに機密データを挿入できます。

結局どちらが良いの?

こちらを参照しながら決めると良いかも

qiita.com

  • Secrets Managerの方が機能が多いけど有料(AWS Systems Managerも使い方によっては有料)
  • 昔はAWS Systems Manager パラメータストアは遅かったらしいが、現在は解決している様子

AWS Systems Manager のパラメータストアで、1 秒間に最大 1,000 件のリクエストがサポートされるようになりました。これにより、多数のパラメータに対してより高い同時アクセスが必要なアプリケーションを実行できるようになります

AWS Systems Manager がより高い API スループットでのパラメーターストアの使用のサポートを開始

ひとまずはAWS Systems Manager パラメータストアを使って、困ったらSecrets Managerに移行することにした

AWS Systems Manager パラメータストアのつかいかた

概要

  1. ロールの設定
  2. 機密情報の設定
  3. containerDefinitions の secrets にて呼び出す

1. ロールの設定

ECSを実行するロールに以下の権限を追加する

        "ssm:GetParameters",
        "kms:Decrypt"

自分の場合、今まで使用していたECS実行用のロールにインラインポリシーとしてアタッチした

(厳密にやるなら、アクセスできる機密情報の範囲をResourceで指定すること)

f:id:kasei_san:20190729093800p:plain

2. 機密情報の設定

AWS System Manager -> パラメータストア -> パラメータの作成 で設定できる

f:id:kasei_san:20190729094102p:plain

「安全な文字列」にしないと、暗号化されないので注意

f:id:kasei_san:20190729094324p:plain

よそのアカウントのKMSキーを使いたい場合は、「別のアカウント」にする

f:id:kasei_san:20190729094352p:plain

3. task Definition の containerDefinitions の secrets にて呼び出す

  • name に機密情報を格納する環境変数名を設定
  • valueFrom に AWS System Manager パラメータストアのパラメータのarnを入力する
    "containerDefinitions": [
        {
            "secrets": [
              {
                "name": "DATABASE_USERNAME",
                "valueFrom": "arn:aws:ssm:us-east-1:*********:parameter/DATABASE_USERNAME"
              },
              {
                "name": "DATABASE_PASSWORD",
                "valueFrom": "arn:aws:ssm:us-east-1:*********:parameter/DATABASE_PASSWORD"
              }
            ],

以上で、task実行時に環境変数に機密情報が格納されます!! 便利 & かんたん!!