Open74

blue/green deploy

kajirikajirikajirikajiri

昨日のログから考える。

  • まず、blue/greenデプロイをスタートしてもインスタンス一覧にインスタンスが増えない。greenのインスタンスが立ち上がるはずである。誰がインスタンスを立ち上げるのか?というのが問題かな?
  • codedeployは誰が行なっているのか?IAMをアタッチすることができるので、アタッチしているし、このアタッチしているポリシーはAWSがサンプルとして定義していたもの。FullとLimitedがあり、Fullの方を洗濯しているし、問題ないはず。
  • インスタンスを立ち上げるのがcodedeployer??そんなものがあるのか??ちょっとcodedeployのドキュメントを読む必要がありそうだな。
  • codedeployの基礎を覚えて、サンプルがあればやる。これはrolling updateでも良い。次に、blue/greenデプロイのサンプルをやる。

こんな感じかな

blue/greenて2つ目が起動して最初のやつが消えるんだよね?
だったら、2つ目が起動しようとするよね?
全くでインスタンス一覧に出て来ないんだよね。
なんかおかしい。
blue/greenとかいう問題じゃない気がしてきた
結局logは出てない

一つ思った。今私がやっているのはblue/greenデプロイ。
今起動しているインスタンスと新しく立ち上げているインスタンスがある。
今起動している方にagentを色々入れていた。
が、新しく立ち上げた方がうまく起動しない、だからログが欲しいのではないか?
ならば、新しく立ち上げ方にagentを入れるべきでは?
しかし、今の方法だと起動済みのインスタンスにしかagentを入れることができない。
やっぱり起動する時のコマンドでうまいことやらないとダメかな。

https://zenn.dev/kajirikajiri/scraps/9c0cd55e3d70d2

kajirikajirikajirikajiri

ん?タグが必要?

To specify which instances are included in a CodeDeploy deployment group, you specify tags in one or more tag groups. Instances that meet your tag criteria are the ones that the latest application revision is installed on when a deployment to that deployment group is created.

kajirikajirikajirikajiri

You can also include Amazon EC2 Auto Scaling groups in deployment groups, but they are identified by their names rather than by tags applied to instances. For information, see Integrating CodeDeploy with Amazon EC2 Auto Scaling.

auto scaleは名前で判別

kajirikajirikajirikajiri

そもそもecsでやってたら勝手にcodedeployになったんだよな。タグとか勝手にやってんのか?

kajirikajirikajirikajiri

ecampleみると同じようなことが書いてある。

タグのキーと値: AWS CodeDeploy はこのタグのキーと値を使用して、デプロイ中にインスタンスを見つけます。デフォルト値のままにしておきます。

https://aws.amazon.com/jp/getting-started/tutorials/deploy-code-vm/#:~:text=タグのキーと値%3A AWS CodeDeploy はこのタグのキーと値を使用して、デプロイ中にインスタンスを見つけます。デフォルト値のままにしておきます。

kajirikajirikajirikajiri

blue/greenの手順書いてた

Instances are provisioned for the replacement environment.
The latest application revision is installed on the replacement instances.
An optional wait time occurs for activities such as application testing and system verification.
Instances in the replacement environment are registered with an Elastic Load Balancing load balancer, causing traffic to be rerouted to them. Instances in the original environment are deregistered and can be terminated or kept running for other uses.

https://docs.aws.amazon.com/codedeploy/latest/userguide/applications-create.html

kajirikajirikajirikajiri

思ってた通りでした。
最初の行でgreenのインスタンスがプロビジョニングされるはずなんだよな。されないんだよな?なぜに

kajirikajirikajirikajiri

ん?あれはec2用のやつかもしれない

Blue/green on an Amazon ECS compute platform: Traffic is shifted from the task set with the original version of an application in an Amazon ECS service to a replacement task set in the same service. You can set the traffic shifting to linear or canary through the deployment configuration. The protocol and port of a specified load balancer listener is used to reroute production traffic. During a deployment, a test listener can be used to serve traffic to the replacement task set while validation tests are run.

こっちがecsかな

kajirikajirikajirikajiri

んーー?同じサービスないの代替タスクセットって書いてますね。
ちょっと気になってたんだよね。タスクの数1にしてたんだよね多分。これのせいかも。サービスないの
タスクの数が1がmaxだけど、codedeployのblue/greenで2個目のタスクを作ろうとするけどできないみたいな。

kajirikajirikajirikajiri

なんか違うな。上限を2個として、1個起動しますとかならわかるけど、これだと、2個常に実行だよね?

kajirikajirikajirikajiri

DAEMONでも同じように2つ起動しておくけど、維持しておくだけでトラフィックは割り当てないとかかな?

kajirikajirikajirikajiri

デーモンのスケジュール戦略では、指定したすべてのタスク配置制約を満たすクラスター内のアクティブなコンテナインスタンスごとに、1 つのタスクのみをデプロイします。また、サービススケジューラは、実行中のタスクのタスク配置の制約事項を評価し、配置制約を満たさないタスクを停止します。この戦略を使用する場合、タスクの必要数や配置戦略、サービスの Auto Scaling ポリシーを指定する必要はありません。

レプリカスケジュール戦略では、クラスターに必要数のタスクを配置して維持します。
Fargate でタスクを実行するサービスを作成する場合、サービススケジューラは、新しいタスクの起動時や実行中タスクの停止時に、アベイラビリティーゾーン間の負荷バランスを維持します。タスク配置戦略や制約を指定する必要はありません。

多分、想像とあってたけど、デーモンの残りのタスクが何やってんのかよくわかんない。予約っぽいこと書いてたけど

kajirikajirikajirikajiri

アベイラビリティーゾーンで分けてgreenが立ち上がると思ってるんです

kajirikajirikajirikajiri

これは問題なかったdeploy対象のコンテナのポートなので、3000

kajirikajirikajirikajiri

Blue/Green デプロイタイプを使用する Amazon ECS サービスを作成するには、「Amazon ECS サービスの作成」を参照してください。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/create-service.html

Blue/Green デプロイタイプを使用したサービスの作成手順を示すチュートリアルが用意されています。詳細については、「チュートリアル: Blue/Green デプロイを使用するサービスの作成」を参照してください。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/create-blue-green.html

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/deployment-type-bluegreen.html#deployment-type-bluegreen-console

kajirikajirikajirikajiri

8080をloadbalancerのsgが許可してなかったので許可した
tagが伝搬するようにした

kajirikajirikajirikajiri

クラスターをみるとタスクがあるけど、サービスをみるとタスクがない。
何この状態

kajirikajirikajirikajiri

起動タイプが EC2 であり、タスク定義でコンテナインスタンスの静的ホストポートマッピングを使用する場合は、サービスのタスクごとにクラスターで、指定したポートを使用できるコンテナインスタンスが 1 つ以上必要です。この制限は、タスク定義で bridge ネットワークモードを使用した動的ホストポートマッピングを使用する場合は適用されません。詳細については、「portMappings」を参照してください

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/basic-service-params.html#:~:text=入力します。-,注記,-起動タイプが

kajirikajirikajirikajiri

なかなかの難題!!!
blue/greenわからんけど、つまづきまくっててawsの操作が高速になってきた。
問題は時間が足りないことです。無限に対応したいんですけどね。

kajirikajirikajirikajiri

もう一度考えてみよう。
インスタンスが立ち上がってくれれば良いんです。とりあえず。
ログが出れば権限ないよとか言ってくれそうなんですが、codedeploy agentをdocker imageに入れちゃえばいいのかね?新しくec2のインスタンスが立ち上がったらそれに入れるんだよね?立ち上がってないんだよね!!
なぜにインスタンスが立ち上がらないのか不明。不明だが、この問題を小さくした場合、codedeployによってインスタンスが立ち上がることが確認できればいいのではないか?
ecs固有の問題だったら解決しませんけどね。
まあ、ちょっとやってみましょう

kajirikajirikajirikajiri

一応流れを見てみたんだけど、不足しているものがわからなかった

kajirikajirikajirikajiri

CodeDeploy can deploy application content that runs on a server and is stored in Amazon S3 buckets, GitHub repositories, or Bitbucket repositories.

サーバーで動くのね?どのサーバーかな

kajirikajirikajirikajiri

Amazon ECS blue/green deployments are supported through both CodeDeploy and AWS CloudFormation. Details for these deployments are described in subsequent sections.

cloudformationでもできるっぽい

kajirikajirikajirikajiri

service roleがインスタンスの操作を行うっぽいね。serviceに権限が不足している可能性があるね

Service role: An IAM role that grants permissions to an AWS service so it can access AWS resources. The policies you attach to the service role determine which AWS resources the service can access and the actions it can perform with those resources. For CodeDeploy, a service role is used for the following:
To read either the tags applied to the instances or the Amazon EC2 Auto Scaling group names associated with the instances. This enables CodeDeploy to identify instances to which it can deploy applications.
To perform operations on instances, Amazon EC2 Auto Scaling groups, and Elastic Load Balancing load balancers.
To publish information to Amazon SNS topics so that notifications can be sent when specified deployment or instance events occur.
To retrieve information about CloudWatch alarms to set up alarm monitoring for deployments.

kajirikajirikajirikajiri

これは全部あるな

Requirement Where specified
Amazon ECS cluster Deployment group
Amazon ECS service Deployment group
Application Load Balancer or Network Load Balancer Deployment group
Production listener Deployment group
Test listener (optional) Deployment group
Two target groups Deployment group
Amazon ECS task definition AppSpec file
Container name AppSpec file
Container port AppSpec file

kajirikajirikajirikajiri

During the Install lifecycle event:
A replacement task set is created in your Amazon ECS service.
The updated containerized application is installed into the replacement task set.
The second target group is associated with the replacement task set.
This diagram shows deployment components with the new replacement task set. The containerized application is inside this task set. The task set is composed of three tasks. (An application can have any number of tasks.) The second target group is now associated with the replacement task set.

kajirikajirikajirikajiri

イメージではサービスが増えるのかと思ってたけど、サービスを指定してcodedeployが作業するね。
てことは確かに、service内部にタスク定義を使ってタスクが作成されそうだね

kajirikajirikajirikajiri

必要数2にしてみた。
2個起動するのかと思ったけど、既存の1個だけだった。
autoscalingしないと勝手に増えないのかな

kajirikajirikajirikajiri

とりあえず今1個足りない状態。これでデプロイしたらどうなるんだ?

kajirikajirikajirikajiri

ちなみにサービスタイプDAEMONにすると、blue/greenは出来なかった。選択できない。disabled

kajirikajirikajirikajiri

auto scalingオプション今まで無視してましたが、これっぽくないですか?

kajirikajirikajirikajiri

そしてこの部分が気になる。

Service Auto Scaling 用の IAM ロール

これがないとecsはインスタンスの数を調節できないのでは?

kajirikajirikajirikajiri

誰がインスタンスを作成できるんだ?
それともインスタンスの作成権限はあるけど、作成に失敗しているのか?
いやしかし、作成して失敗したなら、失敗して終了したインスタンスが表示される。
つまり、処理に入ろうとして落ちた。作成には入っていない。

kajirikajirikajirikajiri

クラスター使いまわしてるけどもしかしてクラスターの権限設定ミスってるとか??一回全部消すか

kajirikajirikajirikajiri

クラスターの更新っていうボタンを押したけど設定項目すくな

kajirikajirikajirikajiri

権限付与された AWS サービスへの API リクエストを行うためにタスクで使用できるオプションの IAM ロール。Amazon Elastic Container Service タスクロールは IAM コンソールで作成します

このロールは、お客様に代わってコンテナイメージをプルし、コンテナログを Amazon CloudWatch に発行するタスクに必要です。まだ ecsTaskExecutionRole を持っていない場合は、お客様のためにそれを作成することができます。