実践Terraform ch12 設定管理
https://github.com/wand2016/terraform_ch12_example
コンテナの設定管理
- 実行環境ごとに異なる設定をコンテナ実行時に注入する
- DBホスト名、パスワード等
SSMパラメータストア
- SSM: Simple Systems Manager
- 設定管理のマネージドサービス
- 平文または暗号化したデータとして保存できる
- ~4KB
- KMSの制限
- ~4KB
Terraformによるコード化
よくない
resource "aws_ssm_parameter" "db_username" { name = "/db/username" value = "root" type = "String" description = "データベースのユーザー名" } resource "aws_ssm_parameter" "db_raw_password" { name = "/db/raw_password" value = "VeryStrongPassword!" type = "SecureString" description = "データベースのパスワード" }
- AWSコンソール上では伏せ字になっているが、暗号化すべき情報が
main.tf
に平文で書かれてしまう
よい
resource "aws_ssm_parameter" "db_username" { name = "/db/username" value = "root" type = "String" description = "データベースのユーザー名" } resource "aws_ssm_parameter" "db_password" { name = "/db/password" value = "uninitialized" type = "SecureString" description = "データベースのパスワード" lifecycle { ignore_changes = [value] } }
- 未初期化のダミー値を入れておいてapply
docker-compose run aws ssm put-parameter --name '/db/password' --type SecureString \ --value 'ModifiedStrongPassword!' --overwrite
{ "Version": 2, "Tier": "Standard" }
コード化する必要ある?
- 最初からこれでいいじゃん:
docker-compose run aws ssm put-parameter --name '/db/password' --type SecureString \ --value 'ModifiedStrongPassword!' --overwrite
- 好み
- tfファイルにしておくと、ドキュメンテーションの場所として有用
SSMパラメータストアとECSの統合
[ { "name": "alpine", "image": "alpine:latest", "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "batch", "awslogs-group": "/ecs-scheduled-tasks/example" } }, + "secrets": [ + { + "name": "DB_USERNAME", + "valueFrom": "/db/username" + }, + { + "name": "DB_PASSWORD", + "valueFrom": "/db/password" + } + ], - "command": ["/bin/date"] + "command": ["/usr/bin/env"] } ]