質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

1回答

2231閲覧

ECSのタスク定義を自動で更新したい CodeDeploy

Nero1129

総合スコア130

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

1グッド

1クリップ

投稿2022/07/26 16:11

編集2022/07/27 10:40

前提

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
yuma.inaura👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/07/27 07:54

タスク定義とAppSpecはどんな感じになってますか
Nero1129

2022/07/27 10:40

載せておきましたので、ご確認お願いします
yu_1985

2022/07/27 14:46

パラメータストアに値を入れてるのならデプロイ時に毎回取得しに行きそうなものですが…。 単純にタスク実行ロールにパラメータストアから値を取得する権限が足りていなかったりしませんか? コンテナが落ちるときのメッセージはどのようになってますかね。 毎回落ちるのか、落ちたり落ちなかったりなのか。 ちなみに、パラメータストア内の値を更新して反映させたいならその都度デプロイし直す必要があるはずです。
Nero1129

2022/07/28 01:08

そもそも質問の意図が通じてなかったようです。すみません。 パラメーターも読めますし、コンテナも上がってます。 Sercretの中身が開発要件で増えた際に、terraformもtaskdef.jsonを毎度いじるのは面倒なので、片方に集約したいって話です。 buildspecで既存のtaskdefを拾ってきて、sedで置き換えるとか… もっと簡単にtaskdefを更新できるよって方法などがあれば知りたいです。
yu_1985

2022/07/28 01:33

環境変数の追加/削除は割と破壊的な変更なのでタスク定義を更新した上でデプロイするように運用するしかないと思いますね…。 タスク定義とアプリケーションを例えば同じリポジトリで管理しているなら同時に更新すれば良いと思うのですが、そうではないということでしょうか。 個人的に、環境変数がいきなり生えてきてそれがタスク定義に反映されない運用に問題があるように思えますが…。 あるいは、面倒でもCodePipelineに承認のステップを入れてそのタイミングで確認するとか。 そもそもどのシークレットを使う必要があるのかはどこかで管理されてるのでしょうか?
yu_1985

2022/07/28 01:36

やろうと思えばCodeBuildに任意の処理を実行させることができるので、どうしてもというならそこで作り込むしかないと思いますね。 変数を反映させるだけならタスク定義自体を直接API経由で更新すればいいでしょう。 ただ、タスク定義をTerraform管理してるなら確実に差分が生まれるので個人的にはあまりお勧めしないです。
Nero1129

2022/07/28 05:13

アプリとtaskdef.jsonは同じリポで管理。Terraformは別リポで管理ですね。 なので、環境変数を付け足すとなると、taskdef,terraformの2つの場所で更新しなくてはいけないのでつらい状態です。※リポの構成を考えたのは自分ではないので、悪しからず… リポを同じにしたところで、taskdefもterraformも更新しなくちゃいけないので、どう運用すべきがが悩ましいです。
guest

回答1

0

根本的な解決方法はないように思えます。
これだけのためにピタゴラスイッチ的な仕組みを作るくらいなら双方更新するほうがまだマシだと思います。

ECSのタスク定義のjsonをアプリが管理しているにも関わらず、そのTerraformを別リポジトリで管理しているのがそもそもの問題なのでそこを無理に自動化するのは筋が悪いと思います。
インフラをTerraformで管理しているなら、管理の主体はTerraformであるべきです。
にもかかわらず、アプリ側が更新したtaskdef.jsonを主体に更新しようとしているからおかしなことになっているのです。
gitリポジトリ管理しているなら人間がレビューする時に指摘して双方反映するのが落とし所ではないでしょうか。それがそんなに面倒ですかね?

例えばDB定義を変更した場合、先にデプロイを行わずにまずDB定義の反映を先に行うと思うのですが、それとそんなに違うことでしょうか。

個人的には自動化云々ではなくデプロイプロセスの見直しが必要と思います。

投稿2022/07/31 07:02

yu_1985

総合スコア7440

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問