パーソル&サーバーワークス

ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

【CodeCatalyst】WorkflowによるECSコンテナのデプロイ自動化(CI/CD)やってみた

この記事を共有する

目次

はじめに

CodeCatalystでアプリケーションのソースコードを管理していると、CodePipelineではソースプロバイダーとしてCodeCatalystが選択できないため、代わりにCodeCatalyst内の「Workflow」を使用してCI/CDやってみました。
全部書くと長いので、Workflowの流れと使用したYAMLファイルのご紹介です。

イメージ

CodeCatalystのリポジトリへ手動でのpush①をトリガーに、②~④をWorkflowで自動化
イメージ図.png

前提条件

ECSクラスターの作成やCodeCatalystのリポジトリ作成・各種設定は省略しています。

手順

CodeCatalystのリポジトリにファイルを追加

Dockerファイル・ソースファイルに加えてECSのタスク定義ファイルを追加する必要があります。
今回は、以下のディレクトリ構成としています。
ディレクトリ構成.png
以下が、今回使用したタスク定義ファイル(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

workflow①.png

2. [Action]をクリックし、「Deploy to Amazon ECS」を検索し、右下の+をクリック
workflow②.png

3. 「YAML」をクリックすると以下のようなYAMの初期ファイルが表示されます。以降に記載する「YAMLファイル全文」を編集し、ここに貼り付け
workflow③.png
<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
4. 上記の内容に編集後、右上の[Validate]で構文を検証し、問題なければ[Commit]をクリック

5. [Commit message]を入力して[Commit]をクリック。しばらく待つと、画面遷移しワークフローが実行される
workflow⑤.png

↓処理中のアクションのボックスをクリックすると、処理中の詳細の確認が可能
workflow⑤2.png

6. 問題なく完了したらすべてに緑のチェックマークが付きます。[Runs]タブからも、成功したかどうかの確認が可能
workflow⑥.png

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

この記事は私が書きました

中野 友加里

身体動かすの好きです。頑張って同じくらい頭も動かします。

中野 友加里

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。