ECSコンテナーインスタンス(Dockerホストについて話している-ここでAWSの用語が気に入らない)とデプロイを2つの別個のものとして保持します。
ECSスタックを起動して実行します。CloudFormationおよびAuto-scalingグループを介して管理できますが、それで問題ありません。ちょうどあなたが展開するプラットフォームとしてクラスタを考えるに、あなたがする必要はありませ何か再デプロイ。
次に、CDの場合、最も簡単な方法は、サービス定義を更新して新しいタスク定義を使用し、ECSでコンテナーをローリング更新することです。
タスクを開始するたびに、ECSは、イメージがローカルにある場合でもdocker pull image:tagを実行して、そのimage:tagの最新バージョンがあることを確認します。したがって、実際に使用するイメージタグは重要ではありません(ビルドごとにタグを変更する必要はありません)。
つまり、myimage:latestを何度も何度もビルドして、簡単にデプロイできます。
必要なのは、image = myimage:latestのタスク定義です。そのタスク定義を使用してサービスを作成し、ECSがタスク(サービスのインスタンス)を開始するたびに、作成した最新の「myimage:latest」になります。
そこから、パズルの1つのピースだけが欠落しています。CodeDeployから何か、おそらくラムダ関数を呼び出して、タスク定義の新しいリビジョンを作成し、サービスを更新すると、ECSはそのリビジョンの新しいタスクを自動的に作成します。古いタスクを削除します。
例:
MyServiceというサービスを作成したと仮定します。タスク定義MyTaskDefinition:1(リビジョン1)に対して2つのタスクを実行するようにそのサービスを構成したこと。そのタスク定義では、イメージが「myimage:latest」に設定されているコンテナ定義が1つあります。
- 昨日、ID(SHA)365d8f7bf565を持つmyimage:latestをビルドしました。
- コンテナインスタンスABCはMyTaskDefinition- 1 -containerName-someLongId という名前のタスクを実行しています。そのコンテナを検査すると、「sha256:365d8f7bf565 ..........」というイメージが実行されています
- 他のコンテナインスタンスDEFは別のタスクを実行しています。名前は似ていますが(IDのみが異なります)、同じイメージを実行しています。
- リポジトリに変更をプッシュします。
- CodePipelineはその変更をピックアップし、イメージをECRにビルドして公開します。
- その新しいDockerイメージもmyimage:latestですが、そのID(SHA)はf7ec5e54ac96です
- 次に、パイプラインにステップを追加して、Lambda関数とAWS NodeJS SDKを使用してクラスターへの呼び出しを行う必要があります。
- 新しいタスク定義を作成します(以前とまったく同じになります)。それはMyTaskDefinition:2になります
- MyServiceを更新して、MyTaskDefinition:2(1ではなく)を使用します。
- ECSは新しいタスクを作成します。コンテナ名はMyTaskDefinition- 2 -containerName-someLongIdになります。これらのコンテナを検査すると、「sha256:f7ec5e54ac96 .......」が実行されていることがわかります。おそらく、コンテナインスタンスABCに2つのタスクがあり、おそらくそれらはスプレーされます(サービスの構成によって異なります)
- しばらくすると、ECSはABCとDEFから古いタスクMyTaskDefinition-1-containerName-someLongIdを削除します。
注:実際に新しいタスク定義を作成する必要はありません。必要に応じて、代わりにサービスのタスクリストを取得し、それらを1つずつ手動で停止できます。新しいタスクを停止する前に、ECSがタスクを再起動するのを待つ必要があります(つまり、最初のコンテナーを停止し、ECSがそれを置き換えるのを待って、2番目のコンテナーを停止します)。ECSがコンテナーを再起動すると、前に説明したように、ビルドされた最新のmyimage:latestが取得されます。新しいタスク定義を作成する方が簡単でエラーが少ないと思います(新しいタスク定義があれば、ECSはローリング更新を処理します)。