自己紹介
はじめましてSREとして従事しているもいもいと申します。
私はインフラエンジニアとして約7年ほど金融系のSIerとして業務に従事してきました。
割とガチガチな運用要件やセキュリティ要件の対応を主務としており、前職では書物(設計書)などを書いたりすることが多かったです。
ずっとSIerとして業務に従事してきて自社開発やSaasビジネスをしている企業で
看板を背負って働きたいという思いから現職に転職しました。
今ではSREとしてコンテナ開発のリプレイスや運用などを担当しています。
SREと言っても私自身全然フルスタックではなくインフラ部分を担当しています。
(現在アプリ領域も勉強中!!)
この記事の目的
PRJでEC2での開発からECSへの基盤リプレイスを実施しました。
その中で環境変数の引き渡す方法を検討してました、
様々な方法がある中で、割とユニークな選択をしたと思うので、
設計する中で学んだことや考慮したことを残しておきたいと思います。
この記事がコンテナの環境変数周りを設計・実装する人にとって有益な情報になるように善処します。
環境変数って
環境変数とは、OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。プログラムの実行時などに必要となる、利用者やコンピュータごとに内容が異なる設定値などを記録するために用いられる。
例えば、DBの接続情報等を環境変数でコンテナに渡したいという場面とかありますよね。
コンテナに環境変数を渡す方法の選択肢
一般的にはECSコンテナには以下の2つの方法で環境変数を設定することが出来ると思います。
- ベタ書き
- パラメータストア/Secrets Managerからインポート
上から順に簡単に渡し方を記載していきます。
ベタ書き
タスク定義の環境変数欄に環境変数をベタ書きするという内容です。
シンプルでわかりやすいという一方で秘匿情報などの記載に関してセキュアじゃないというデメリットがあります。
公式マニュアルは以下の通り
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/taskdef-envfiles.html
パラメータストア/Secrets Managerからインポート
タスク定義の環境変数欄に記載するという意味では上記のベタ書きと変わりませんが、環境変数の内容をそのまま書くのではなく、あらかじめパラメータストアやSecretsManagerに環境変数を記載しておき、そのArn情報を記載するという方式です。
このやり方であれば、秘匿情報も記載できるため、セキュアに環境変数を渡すことが出来ます。
公式マニュアルは以下の通り
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html
じゃあ実際にどの方法を選択したの?
今回のPRJでは上記のいずれでもない方法で実装しました。
理由はインフラ側に都度依頼せずともアプリ側でも環境変数を追加したかったからです。
どうやってコンテナに環境変数を渡している?
ssm-bypass※というツールを使用して実装しました。
このツールをコンテナイメージに組み込むことで起動時にパラメータストアに登録されている環境変数を呼び出すことが出来ます。
※知り合いが開発した個人ツールですので注意
まとめ
インフラ担当者に依頼せずとも環境変数を追加できる方法は既存の選択肢には有りませんでしたが、ssm-bypassというツールを使うことで要件を満たすことが出来ました。
ECSではなく、kubernetesだともう少し細やかに環境変数をコンテナに引き渡せるのですが、ECSだと中々今回のような要件を充足することが難しいです。
(もしかすると他の方法でもこの要件は満たせるかもしれないですが...)
本ツールは個人で作成しているため、保守性の観点から使用できる企業は限られてくるとは思いますが、参考にして自社で作成しても良いかもしれません。