ヤマムギ

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

  関連記事

RDSの拡張モニタリングを有効にしました

RDS for MySQLです。 変更メニューで、[拡張モニタリングを有効にする …

WordPressで画像アップロードができなくなった(AWS WAFでブロックしていた)

WordPressで画像がアップロードできなくなりました。 こんなメッセージです …

AWS Lambda(Python)でDynamoDB テーブルを日次で削除/作成(オートスケーリング付き)

この記事はAWS #2 Advent Calendar 2018に参加した記事で …

AWS Cost Anomaly Detectionでコストモニターを作成しました

[ご利用開始にあたって]を押下しました。 このあと画面を説明してくれるツアーがあ …

Azure AD SSOからAWS SSOに統合するための提供情報

Azure AD SSO担当者に送る情報をこちらの記事を見て確認しました。 チュ …

EC2とRDSのMySQLを他のAWSアカウントへ移設する

他のAWSアカウントへシステムごと移設した場合の手順です。 構成はEC2とRDS …

slackのbotにWikipediaを調べてもらう(Python on AWS Lambda + API Gateway)

slackのbotに少しでも役に立ってもらおうと、Wikipediaを調べてもら …

Introduction to Amazon EKS Workshopの記録

AWS Workshop StudioのIntroduction to Amaz …

AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする

インターネット上に公開されている情報をDynamoDBにつっこみたいだけなので、 …

ブログ画像のシンガポールリージョンへのレプリケーションはじめました

このブログの画像はS3バケットに保存して、CloudFront経由で配信していま …