- 公開日
- 最終更新日
【CodeCatalyst】WorkflowによるECSコンテナのデプロイ自動化(CI/CD)やってみた
この記事を共有する
目次
はじめに
CodeCatalystでアプリケーションのソースコードを管理していると、CodePipelineではソースプロバイダーとしてCodeCatalystが選択できないため、代わりにCodeCatalyst内の「Workflow」を使用してCI/CDやってみました。全部書くと長いので、Workflowの流れと使用したYAMLファイルのご紹介です。
イメージ
CodeCatalystのリポジトリへ手動でのpush①をトリガーに、②~④をWorkflowで自動化前提条件
ECSクラスターの作成やCodeCatalystのリポジトリ作成・各種設定は省略しています。手順
CodeCatalystのリポジトリにファイルを追加
Dockerファイル・ソースファイルに加えてECSのタスク定義ファイルを追加する必要があります。今回は、以下のディレクトリ構成としています。
以下が、今回使用したタスク定義ファイル(task.json)です。
{
"executionRoleArn": "arn:aws:iam:::role/",
"containerDefinitions": [
{
"name": "",
"image": "$REPOSITORY_URI:$IMAGE_TAG",
"cpu": 256,
"memory": 128,
"essential": true,
"portMappings": [
{
"hostPort": 80,
"protocol": "tcp",
"containerPort": 80
}
]
}
],
"requiresCompatibilities": [
"FARGATE"
],
"networkMode": "awsvpc",
"cpu": "256",
"memory": "512",
"runtimePlatform": {
"cpuArchitecture": "X86_64",
"operatingSystemFamily": "LINUX"
},
"family": ""
}
workflowの作成
ワークフローを作成していきます。1. [workflow] > [Create workflow]をクリックし、以下の内容で設定後、[Create]をクリック
・Source repository:今回用に作成したリポジトリ
・Branch:main
2. [Action]をクリックし、「Deploy to Amazon ECS」を検索し、右下の+をクリック
3. 「YAML」をクリックすると以下のようなYAMの初期ファイルが表示されます。以降に記載する「YAMLファイル全文」を編集し、ここに貼り付け
<yamlファイル全文>
クリックして展開
Name: Workflow_ecs_xxx #ワークフロー名
SchemaVersion: "1.0"
# Optional - Set automatic triggers.
Triggers:
- Type: Push
Branches:
- main
# Required - Define action configurations.
Actions:
Build_application:
Identifier: aws/build@v1
Inputs:
Sources:
- WorkflowSource
Variables:
- Name: region
Value: ap-northeast-1 #リージョン
- Name: registry
Value: .dkr.ecr.ap-northeast-1.amazonaws.com #ECRレジストリ
- Name: image
Value: #ECRリポジトリ
- Name: image-tag
Value: #イメージタグ
Outputs:
AutoDiscoverReports:
Enabled: false
Variables:
- IMAGE
Compute:
Type: EC2
Environment:
Connections:
- Role: #コネクションのロール
Name: <"account_name"> #アカウント
Name: #Environments名
Configuration:
Steps:
- Run: export account=`aws sts get-caller-identity --output text | awk '{ print $1 }'`
- Run: aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${registry}
- Run: docker build -t ${image} ./test-docker
- Run: docker tag ${image}:${image-tag} ${registry}/${image}:${image-tag}
- Run: docker push ${registry}/${image}:${image-tag}
- Run: export IMAGE=${registry}/${image}:${image-tag}
# Render ECS Task Definition
RenderAmazonECStaskdefinition:
Identifier: aws/ecs-render-task-definition@v1
Configuration:
image: ${Build_application.IMAGE}
container-name: #コンテナ名
task-definition: task.json
Outputs:
Artifacts:
- Name: TaskDefinition
Files:
- task-definition*
DependsOn:
- Build_application
Inputs:
Sources:
- WorkflowSource
#Deploy ECS
DeploytoAmazonECS:
Identifier: aws/ecs-deploy@v1
Configuration:
task-definition: /artifacts/DeploytoAmazonECS/TaskDefinition/${RenderAmazonECStaskdefinition.task-definition}
service: #サービス名
cluster: #クラスターARN
region: ap-northeast-1
Compute:
Type: EC2
Fleet: Linux.x86-64.Large
Environment:
Connections:
- Role: #コネクションのロール
Name: <"account_name"> #アカウント
Name: #Environments名
DependsOn:
- RenderAmazonECStaskdefinition
Inputs:
Artifacts:
- TaskDefinition
Sources:
- WorkflowSource
5. [Commit message]を入力して[Commit]をクリック。しばらく待つと、画面遷移しワークフローが実行される
↓処理中のアクションのボックスをクリックすると、処理中の詳細の確認が可能
6. 問題なく完了したらすべてに緑のチェックマークが付きます。[Runs]タブからも、成功したかどうかの確認が可能
7. AWSマネジメントコンソールでECSタスクを確認すると、新しいコンテナが起動していることが確認できる
これで、次回以降ソースコードをmainブランチにpushすると自動的にこちらのワークフローが実行され、新しいコンテナが起動するようになります。
おわりに
- 初めてのCI/CDだったので何回も失敗しましたが、手順5)のLogsタブでエラーが詳細に表示されるので、トラブルシューティングは割と簡単な気がします。
- 日本語の記事が少なくて残念ですが、AWS公式ドキュメントが見やすかったです。
- 参考に載せてるチュートリアルに、サンプルのDockerファイル・index.htmlなどあるので、使うものなければそちらをご利用いただくのが良いかもしれません。
参考
チュートリアル:Amazon ECS にアプリケーションをデプロイする - Amazon CodeCatalystDeploy a Container Web App on Amazon ECS Using Amazon CodeCatalystこの記事は私が書きました
中野 友加里
身体動かすの好きです。頑張って同じくらい頭も動かします。