はじめに
ECSの環境変数機能のちょっとニッチな使い方。
コンテナに固め込んで起動することから、動的に変更することができなくなるので注意。環境情報はコンテナから切り離すというプラクティスから離れるアンチパターンであることを意識して、コンテナ化するプロダクトがクラウドにリフトするだけのケース等やむを得ない場合だけ利用することを推奨。
SSM Parameter Storeの参照方法
コンテナのアプリケーションからSDKを使って参照するという方法もあるが、もっとお手軽に実装するのが、ECSの(正確にはタスク定義の)環境変数を使うのが良い。
以前の記事で書いた「コンテナの編集」⇒「環境変数」から設定可能だ。プルダウンで「ValueFrom」を選択して、Parameter StoreのARNを指定する。
TerraformでIaCで記述するのであれば、aws_ssm_parameter
リソースを
resource "aws_ssm_parameter" "test" {
name = "/${var.environment}/teststring"
description = "Test for SSM Parameter Store"
type = "SecureString"
value = "this-is-test-string"
tags = {
environment = var.environment
}
}
な感じで定義し、これをaws_ecs_task_definition
リソースの中で
resource "aws_ecs_task_definition" "ecsfargate" {
:
(中略)
:
container_definitions = <<EOF
[
{
"name" : "${local.container_name}",
"image": "${data.aws_ecr_repository.my_image.repository_url}:latest",
"cpu": 0,
"memoryReservation": 256,
"secrets": [
{
"name": "TESTSTRING",
"valueFrom": "${aws_ssm_parameter.test.arn}"
}
],
:
(以下略)
として参照する。
あとは、アプリケーションの中で環境変数で参照するなり、Dockerの起動コマンドの中で参照するなりしてあげれば期待通りのことができるようになる。
ただし、上記の通り、aws_ssm_parameter
のtype
プロパティがSecureString
であるにもかかわらず、.tfファイル中の文字列は平文になってしまっている。チームで作業する場合なんかは、非常によろしくないのではなかろうか……。
ちなみに、Terraformの公式ドキュメントでは、「Terraform Cloud使うかリモートステートでちゃんと暗号化してね!」と書いてある。terraform.stateファイルはともかくとして、ローカル情報を暗号化したまま渡すことはできないのだろうか……。