前提
AWSのCodePipelineを使用して、CI/CDを回してます。
現在、セオリー通り、タスク定義をtaskdef.json
で書きイメージのパスなどをCodeDeployで自動更新しています。
開発が進み、途中で環境変数などを追加しSSMに入れ、コンテナから参照したいなどの要求が発生します。
その際、シークレットに関しては手動管理なので、taskdef.json
内のシークレットが更新されないまま、環境変数が見つからず、コンテナが落ち、Deployが出来ないなどで度々頭を悩ませています。
実現したいこと
taskdef.json
のシークレットを自動で更新させたいです。
基本的に管理はTerraformで行っております。
AppSpecでTerraformで反映させたタスク定義を元に、新たなタスク定義を上書きするなどの方法があれば教えていただきたいです。
コード
taskdef.json
1{ 2 "executionRoleArn": "省略", 3 "containerDefinitions": [ 4 { 5 "logConfiguration": { 6 "logDriver": "awslogs", 7 "options": { 8 "awslogs-group": "ecs", 9 "awslogs-region": "ap-northeast-1", 10 "awslogs-stream-prefix": "ecs" 11 } 12 }, 13 "portMappings": [省略], 14 "command": [省略], 15 "cpu": 省略, 16 "environment": [省略], 17 "mountPoints": [], 18 "secrets": [ 19 { 20 "valueFrom": "arn:aws:ssm:ap-northeast-1:9999999999999:parameter/DB_URL", 21 "name": "DATABASE_HOST" 22 }, 23 { 24 "valueFrom": "arn:aws:ssm:ap-northeast-1:9999999999999:parameter/DB_PASSWORD", 25 "name": "DATABASE_PASSWORD" 26 }, 27 { 28 "valueFrom": "arn:aws:ssm:ap-northeast-1:9999999999999:parameter/DB_USERNAME", 29 "name": "DATABASE_USER" 30 } 31 ], 32 "memory": 省略, 33 "volumesFrom": [], 34 "image": "<IMAGE1_NAME>", 35 "name": "省略" 36 } 37 ], 38 "placementConstraints": [], 39 "memory": "省略", 40 "taskRoleArn": "省略", 41 "family": "default", 42 "networkMode": "awsvpc", 43 "cpu": "省略", 44 "volumes": [] 45}
appspec.yml
1version: 0.0 2Resources: 3 - TargetService: 4 Type: AWS::ECS::Service 5 Properties: 6 TaskDefinition: <TASK_DEFINITION> 7 LoadBalancerInfo: 8 ContainerName: "省略" 9 ContainerPort: 80
タスク定義とAppSpecはどんな感じになってますか
載せておきましたので、ご確認お願いします
パラメータストアに値を入れてるのならデプロイ時に毎回取得しに行きそうなものですが…。
単純にタスク実行ロールにパラメータストアから値を取得する権限が足りていなかったりしませんか?
コンテナが落ちるときのメッセージはどのようになってますかね。
毎回落ちるのか、落ちたり落ちなかったりなのか。
ちなみに、パラメータストア内の値を更新して反映させたいならその都度デプロイし直す必要があるはずです。
そもそも質問の意図が通じてなかったようです。すみません。
パラメーターも読めますし、コンテナも上がってます。
Sercretの中身が開発要件で増えた際に、terraformもtaskdef.jsonを毎度いじるのは面倒なので、片方に集約したいって話です。
buildspecで既存のtaskdefを拾ってきて、sedで置き換えるとか…
もっと簡単にtaskdefを更新できるよって方法などがあれば知りたいです。
環境変数の追加/削除は割と破壊的な変更なのでタスク定義を更新した上でデプロイするように運用するしかないと思いますね…。
タスク定義とアプリケーションを例えば同じリポジトリで管理しているなら同時に更新すれば良いと思うのですが、そうではないということでしょうか。
個人的に、環境変数がいきなり生えてきてそれがタスク定義に反映されない運用に問題があるように思えますが…。
あるいは、面倒でもCodePipelineに承認のステップを入れてそのタイミングで確認するとか。
そもそもどのシークレットを使う必要があるのかはどこかで管理されてるのでしょうか?
やろうと思えばCodeBuildに任意の処理を実行させることができるので、どうしてもというならそこで作り込むしかないと思いますね。
変数を反映させるだけならタスク定義自体を直接API経由で更新すればいいでしょう。
ただ、タスク定義をTerraform管理してるなら確実に差分が生まれるので個人的にはあまりお勧めしないです。
アプリとtaskdef.jsonは同じリポで管理。Terraformは別リポで管理ですね。
なので、環境変数を付け足すとなると、taskdef,terraformの2つの場所で更新しなくてはいけないのでつらい状態です。※リポの構成を考えたのは自分ではないので、悪しからず…
リポを同じにしたところで、taskdefもterraformも更新しなくちゃいけないので、どう運用すべきがが悩ましいです。
