ヤマムギ

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しました。

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

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

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


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

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

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

 - AWS , , ,

ad

ad

  関連記事

webフォームからの問い合わせをRedmineに自動登録して対応状況を管理する(API Gateway + Lambda)

先日、検証目的で作成したRedmineの冗長化の一機能として、webフォームから …

AWS Transit GatewayのAcceleratedサイト間VPN接続確認

Transit GatewayでVPN接続を作成するときに、Global Acc …

Amazon FSx for Lustreのユーザーガイド入門演習

ファイルシステムの作成 FSx for Lustreを選択しました。 容量やスル …

EC2 Instance Connect向けのセキュリティグループのソースにプレフィックスリストを

EC2 Instance Connect、便利ですね。 キーペア不要で、EC2イ …

Amazon EC2のAMIイメージを自動取得して保持日数が過ぎたら削除

画像の保存をEC2に戻した事もあってEC2のバックアップの自動取得を勉強がてらや …

AWS Personal Health Dashboardのパブリックイベントの記録

東京リージョンで発生したので、スクリーンショットを取っておいたので記録しておきま …

AWS Summit Tokyo 2017 Day3 開場~基調講演~Dev Day Night

AWS Summit Tokyo 2017 参加2日目のDay3です。 基調講演 …

Amazon Linux 2023、T4Gインスタンス、PHP8にWordPressを移行しました

ブログをAmazon Linux 2からAmazon Linux 2023に移行 …

Microsoft TeamsのIncoming Webhooksを使ってAWS Lambda(Python)からFeedlyの記事を自動投稿する

Microsoft Teamsの検証を始めましたので、Slackで自動化している …

CloudFrontのカスタムヘッダーがなければALBのルーティングで403レスポンスを返す

大阪リージョンにはWAFがまだないです(2021年4月現在) 今のこのブログの構 …