ヤマムギ

growing hard days.

*

CodeDeployでECR、ECSにデプロイするパイプラインのチュートリアル

      2021/08/30


チュートリアル: Amazon ECR ソースと、ECS と CodeDeploy 間のデプロイを含むパイプラインを作成する

ECSでAppSpecをどう使うのかを知りたかったので、こちらのチュートリアルをやってみました。

IAMロールの作成

  • ecsTaskExecutionRole

ecsTaskExecutionRoleの実行ポリシーはAWS管理ポリシーのAmazonECSTaskExecutionRolePolicyです。
信頼ポリシーは、ecs-tasks.amazonaws.comからのリクエストを許可します。
これは、ロール作成時に「Elastic Container Service Task」を選択することで設定されました。

  • CodeDeployECSRole

AWS管理ポリシーはAWSCodeDeployRoleForECSです。
信頼ポリシーは、codedeploy.amazonaws.comからのリクエストを許可します。
ロール作成時に「CodeDeploy – ECS」を選択することで設定されました。

イメージを作成してECRにプッシュ

CloudShellでできないかなと思ったのですが、AWS CloudShellコンピューティング環境:仕様とソフトウェアに「現在、AWS CloudShellコンピューティング環境はDockerコンテナをサポートしていません。」とあるので、Cloud9にしました。

Nginxのイメージをダウンロードしました。

チュートリアルどおりで、nginxという名前にECRリポジトリを作成しました。
レスポンスのrepositoryUriをコピーしておきます。

repositoryUriでnginx:latestイメージをタグ付けしました、

get-login-passwordコマンドで一時的認証を取得して、docker loginコマンドでログインしました。
警告は出ますが、ログイン成功です。

プッシュしました。

デプロイされました。

CodeCommitリポジトリの作成とクローン

CodeCommitリポジトリはある前提でしたので、作成してCloud9でクローンしました。

Cloud9には、CodeCommit 認証情報ヘルパーがセットアップ済です。
AWS CodeCommit 認証情報ヘルパーをmacOSに設定しました

タスク定義ファイルとAppSpecファイルを作成してCodeCommitリポジトリにプッシュ

クローンしたリポジトリのディレクトリに以下のtaskdef.jsonとappspec.yamlを作成しました。

taskdef.json

タスク定義を登録しました。

登録されました。

taskdef.json

ローカルのtaskdef.jsonで、”image”: ““に変更しました。

appspec.yaml

は変更しませんでした。

プッシュされました。

Application Load Balancerとターゲットグループの作成

リスナー 8080ポートを追加しました。
デフォルトVPCに作成しました。
セキュリティグループは新規作成で80と8080を許可しました。
ターゲットグループはIPアドレスをターゲットにしました。

ALBを作成しました。

作成後、デフォルトVPCを選択してもう1つターゲットグループを作成しました。
IPアドレスをターゲットにポートは8080にしました。

追加で作成したターゲットグループをALBのリスナー8080に設定しました。

ECSクラスターとサービスを作成する

クラスターはFargateで作成しました。

create-service.json

サービスをCLIで作成するためのJsonファイルを作成しました。

  • taskDefinition
  • cluster
  • targetGroupArn
  • subnets
  • securityGroups
    上記はそれぞれの環境で変更する必要があります。

サービスを作成しました。

サービスの作成ができました。

この時点でALBのDNSにアクセスすると、『Welcome to nginx!』と表示されて、ひとまずのデプロイができている状態です。

ここからパイプラインを構築していきます。

CodeDeployアプリケーションとデプロイグループを作成

プラットフォームでECSを選択してアプリケーションを作成しました。

IAMロールはCodeDeployECSRole、ECSクラスター、サービス、ALB、リスナー、ターゲットグループをそれぞれ選択しました。

「すぐにトラフィックを再ルーティング」を選択して、[元のリビジョンの終了]の時間を5分にしました。
これはブルーグリーンデプロイでデプロイの時間を短縮するためです。
[デプロイグループの作成]ボタンを押下しました。

パイプラインを作成

サービスロールは新しいIAMロールを作成しました。

ソースステージはCodeCommitリポジトリを選択しました。

ビルドステージはスキップしました。

アクションプロバイダーはAmazon ECS(ブルー/グリーン)を選択しました。

CodeDeployのアプリケーションとデプロイグループを選択しました。
ECSタスク定義とAppSpecファイルを指定しました。

保存時にパイプラインが実行されて、デプロイがエラーになって、「無効なアクション設定Container.image contains invalid characters.」と表示されますが、まだ設定は完了していないので大丈夫です。

パイプラインにECRソースを追加

CodePipelineを編集して、ソースステージを編集して、CodeCommitの右で[アクションの追加]を選択しました。

アクションプロバイダーにECRを選択して、リポジトリとタグを指定しました。
出力アーティファクトはMyImageにしました。

CloudWatchのイベントが作成されました。

デプロイステージの編集からデプロイアクションを編集して、入力アーティファクトにMyImageを追加しました。

そして下までスクロールして、入力アーティファクトでMyImageを選択、プレースホルダー文字にIMAGE1_NAMEを入力しました。

これで保存して、[変更をリリースする]ボタンを押下しました。

コンテナを変更してプッシュ

コンテナを変更してdocker pushしました。

パイプラインが起動しました。

デプロイが進行しています。

デプロイが完了しました。


最後までお読みいただきましてありがとうございました!

【PR】 「AWS認定試験対策 AWS クラウドプラクティショナー」という本を書きました。

【PR】 「AWSではじめるLinux入門ガイド」という本を書きました。

【PR】 「ポケットスタディ AWS認定 デベロッパーアソシエイト」という本を書きました。

 - AWS , , ,

ad

ad

  関連記事

東京リージョンの1つのAZ(apne1-az2)でt3.nanoスポットインスタンスが拒否されちゃいました

拒否されちゃいました ちょっとした検証をしようとしてて、t3.nanoのスポット …

RDSスナップショットをS3にエクスポートする新機能を試そうかと思った

やったこと RDSスナップショットをS3にエクスポートできる、という新機能が追加 …

AWS Toolkit for Eclipseをセットアップ(2021年版)

AWS Toolkit for Eclipseをセットアップするで6年前に書いて …

AWS RDS でMySQLインスタンスを構築する

Amazon Web ServiceにはAmazon Relational Da …

ある意味マネジメントコンソールで生成された署名付きURL

マネジメントコンソールにS3オブジェクトの[開く]というボタンがいつのまにか出来 …

このブログをAWS大阪リージョンへ移行しました

大阪リージョン爆誕!! 朝起きて寝ぼけながらリージョンを見てると。 「大阪リージ …

百聞は一見にしかず!AWSセルフペースラボの無料ラボ!

※2019年5月12日現在に試してみた記録です。 AWSセルフペースラボとは A …

AWS DeepLensセットアップの儀

AWS DeepLensのセットアップを開始します。 AWS DeepLensを …

VyOSにSSMエージェントをインストールしました

VyOSにSSHでログインするのも面倒なので、SSMエージェントをインストールし …

ヤマムギ vol.9 (AWS)EC2からAWS CLIコマンドを実行してみようハンズオン 手順

このブログは2020/5/5に開催しました、「ヤマムギ vol.9 (AWS)E …