Atrae Advent Calendar 2019 6日目を担当する新卒1年目の小倉です。
昨日は同じく新卒1年目の土屋の記事でした。
自分はwevoxという事業でたくましく(?)インフラエンジニアをやっております。
セキュリティ強化からスケーリング、データ基盤の構築など手広くやっております。
wevoxチームでは簡単な定期タスクを、ECS Fargateを使って実行しています。
最近FargateからGCPにアクセスする時の認証で詰まったため、解決方法について書いていきます。
全体像
こんな感じです。
肝は環境変数としてCredentialsのJSONファイルを扱い、タスク実行時に渡してやることです。

なぜこうしたか?
GCPへの認証
GCPの各リソースに外部からアクセスする際は、Credentialsの認証が必要です。
こいつはJSONファイルであり、GCPもファイル形式でしか受け取ってくれません。
そのためただ文字列を渡してもダメで、然るべき内容が含まれた(GCP内で発行するだけですが)JSONにパスを通してやる必要があります。
export GOOGLE_APPLICATION_CREDENTIALS="/hoge/fuga/[FILE_NAME].json"
イメージの中にCredentialsを置くこと
今回Secrets ManagerにCredentialsを登録し、run時に環境変数として渡すということをしています。
正直サクッと作るくらいだったらDockerでbuildする時に一緒に固めちゃうのでもいいと思います。
あとGitHubとECRがプライベートだからCredentialsベタ張りでも大丈夫という考えもあります。
しかしやはりCredentialsを一緒にイメージ内に入れてしまうことに気持ち悪さがあります。
本来であれば在処を知っている人を制限するくらいはやってもいいと思います。
つまるところCredentialsベタ張りはセキュリティ上よくないということで、少し時間はかかりましたがこの方法をとりました。
手順
- GCP内でCredentialsを発行
- 発行したCredentialsの中身をAWS Secrets Managerに登録
- DockerイメージをECRに登録
- Fargateのタスクを定義
一つずつ確認していきましょう。
GCP内でCredentialsを発行
GCPのコンソール「APIとサービス」にて「サービスアカウントキー」を作成します。
ここはこれだけなので割愛します。
発行したCredentialsの中身をAWS Secrets Managerに登録
AWS上に環境変数となりうる認証情報を登録できるサービスです。
AWSには類似サービスとしてSystem Managerパラメータストアがあります。このサービスとの違いはいくつかありますが、そのうち一つがファイル形式のものを保存できるというものです。

「+行を追加」と書かれているバーにJSONのキーとバリューを登録していきます。もちろん面倒な時は、JSON形式で書くことも可能です。

あとは登録を進めればOKです。登録が完了すれば、そのキー固有のARN(Amazon Resource Name)が取得できます。
DockerイメージをECRに登録
イメージを適当に作成してECRにpushしましょう。
ECRにレポジトリを登録し、あとは画面に出てくるコマンドを1つずつ実行すればOKです。
$(aws ecr get-login --no-include-email --region ap-northeast-1)
docker build -t hoge/piyo .
docker tag hoge/piyo:latest [ECR repository]/hoge/piyo:latest
docker push [ECR repository]/hoge/piyo:latest
Fargateのタスクを定義
イメージに先ほど登録したECRのURIを貼り付けます。

そしてここがキモになります、というか自分はここで詰まって時間を溶かしました。

やっていることとしては、こんな感じです。
- 環境変数としてKEYを登録。中身は先ほどSecrets Managerに登録したJSONファイルのARN
- ARNを引っ張ってるので
ValueFrom
にします。
- ARNを引っ張ってるので
- 環境変数$KEYをechoでリダイレクトし、ファイルを生成(credentials.json)
- コンテナ内に生成されたファイルにパスを通すので
Value
にします。
- コンテナ内に生成されたファイルにパスを通すので
- 生成されたファイルをそのままGOOGLE_APPLICATION_CREDENTIALSとして環境変数として登録
こうすることで、Dockerのrun時に一時的にSecrets Managerから呼び出してコンテナの中にファイルを置くことができるわけです。
このGUIですが、Dockerのコマンドにするとこうなります。
docker run -e GOOGLE_APPLICATION_CREDENTIALS=credentials.json container_name sh -c `echo $KEY > credentials.json`
感想
Secrets Manager自体は有料ですが、Credentialsをそのままレポジトリに登録したり、イメージの中に入れてしまうことを考えたら全然いいと思います。
他にもっと綺麗なやり方ありそうだーと思いつつ、現在の私だとこれがbetterです。
ご意見あればコメントぜひお願いします。マサカリを鬼の勢いで飛ばしてください。
またつい先日、FargateがEKSで扱えるようになったこともあり、ますますFargate好きが進みそうです。引き続き注目していきます。
最後に
ここに自社のブログを貼るのは恐縮ですが、私の働いているチームのインタビュー記事が先日公開されました!

チームの雰囲気ややっていることもよく分かるので是非ご覧ください。またwevoxやアトラエに興味を持った方、是非ご連絡ください!
明日はyentaチームの遠矢からお送りします!