ヤマムギ

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

  関連記事

Feedlyのフィードを自動でSlackへ投稿する(AWS Lambda , Amazon DynamoDB)

やりたいこと Feedlyで共有したいフィードに特定のタグを付けます。 特定のタ …

Amazon EC2(Amazon Linux 2)にRedmine3.4をインストール

久しぶりに新しい環境でRedmineを構築したくなり、せっかくなのでAmazon …

Amazon ECSサービスでAWS App Meshを使用

AWS App MeshユーザーガイドのAWS App Mesh とAmazon …

AWS Summit 2016 Tokyoに参加してきました (前日 ~ Day1)

AWS Summit 2016 Tokyoにて、セッション聴講、ブース展示拝見、 …

TwilioからのリクエストをAPI Gateway+LambdaでTwimlを返して処理する

Twilioで着信した時のリクエスト先としてTwimlをWebサーバやS3で用意 …

AWS Transfer Family S3向けのSFTP対応サーバーをVPCで作成してEIPをアタッチ

EIPの作成 同じリージョンでEIPを作成しておきます。 SFTP対応サーバーの …

「JAWS-UG 名古屋 2022年 “re:Invent”の復習~忘年会~」に参加しました

re:Inventのおみやげも飲み物、ピザ、お寿司もたくさん。 コラボベースさん …

Amazon SNSサブスクリプションフィルターを設定してPython(boto3)からPublish

上記のような構成でRocketChatを使うとき使わないときがあります。 都度都 …

サービスディスカバリを使用してECSサービスの作成

ECSデベロッパーガイドのチュートリアル:サービスディスカバリを使用して、サービ …

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

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