GitHub ActionsでDockerイメージをAWSへ自動デプロイする

はじめに

現代のソフトウェア開発では、CI/CD(継続的インテグレーション/継続的デリバリー)パイプラインの構築が重要となっています。本記事では、GitHub Actionsを使用してDockerイメージをビルドし、AWSの各サービスへ自動デプロイする方法について解説します。

前提条件

  • GitHubアカウント
  • AWSアカウント
  • ローカル環境にDockerがインストールされていること
  • デプロイ対象のアプリケーションコード

全体の流れ

  1. DockerfileとアプリケーションコードをGitHubリポジトリに用意
  2. AWS ECR(Elastic Container Registry)の準備
  3. AWSへのデプロイ権限を持つIAMユーザーの作成
  4. GitHub SecretsにAWSの認証情報を設定
  5. GitHub Actionsワークフローの作成
  6. デプロイ先の準備(ECS、EKS、App Runnerなど)

1. Dockerfileの準備

まずは、アプリケーションのDockerfileを作成します。以下は簡単なNode.jsアプリケーションの例です:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

2. AWS ECRの準備

AWSコンソールからECRリポジトリを作成します:

  1. AWSコンソールにログイン
  2. ECRサービスを選択
  3. 「リポジトリの作成」をクリック
  4. プライベートリポジトリを選択し、名前を入力(例:my-app)
  5. 作成ボタンをクリック

3. IAMユーザーの作成

GitHubからAWSリソースにアクセスするためのIAMユーザーを作成します:

  1. IAMコンソールに移動
  2. 「ユーザー」→「ユーザーを追加」をクリック
  3. 名前を入力(例:github-actions-user)
  4. アクセスキー – プログラムによるアクセスを選択
  5. 「次へ:アクセス権限」をクリック
  6. 「ポリシーを直接アタッチ」を選択
  7. 以下のポリシーを付与:
    • AmazonECR-FullAccess
    • デプロイ先に応じて追加のポリシー(例:AmazonECS-FullAccess)
  8. ユーザーを作成し、表示されるアクセスキーIDとシークレットアクセスキーを保存

4. GitHub Secretsの設定

GitHubリポジトリに認証情報を安全に保存します:

  1. GitHubリポジトリの「Settings」タブをクリック
  2. 左メニューから「Secrets and variables」→「Actions」を選択
  3. 「New repository secret」ボタンをクリック
  4. 以下のシークレットを追加:
    • AWS_ACCESS_KEY_ID: IAMユーザーのアクセスキーID
    • AWS_SECRET_ACCESS_KEY: IAMユーザーのシークレットアクセスキー
    • AWS_REGION: 使用するAWSリージョン(例:ap-northeast-1)

5. GitHub Actionsワークフローの作成

リポジトリに.github/workflows/deploy.ymlファイルを作成します:

name: Deploy to AWS

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
      
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v2
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ secrets.AWS_REGION }}
        
    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1
      
    - name: Build, tag, and push image to Amazon ECR
      env:
        ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
        ECR_REPOSITORY: my-app
        IMAGE_TAG: ${{ github.sha }}
      run: |
        docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
        docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
        echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

6. デプロイ先の設定

ECSへのデプロイ例

ECRにプッシュしたイメージをECSにデプロイする場合は、ワークフローファイルに以下を追加します:

    - name: Deploy to Amazon ECS
      uses: aws-actions/amazon-ecs-deploy-task-definition@v1
      with:
        task-definition: task-definition.json
        service: my-service
        cluster: my-cluster
        wait-for-service-stability: true

task-definition.jsonファイルをリポジトリに追加:

{
  "family": "my-task",
  "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "my-container",
      "image": "IMAGE_TO_BE_REPLACED",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 3000,
          "hostPort": 3000,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-task",
          "awslogs-region": "AWS_REGION",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "256",
  "memory": "512"
}

そして、ワークフローファイルに以下のステップを追加してtask-definitionのイメージを更新します:

    - name: Fill in the new image ID in the Amazon ECS task definition
      id: task-def
      uses: aws-actions/amazon-ecs-render-task-definition@v1
      with:
        task-definition: task-definition.json
        container-name: my-container
        image: ${{ steps.build-image.outputs.image }}

トラブルシューティング

  • 権限エラー: IAMユーザーに適切な権限が付与されているか確認
  • ビルドエラー: Dockerfileに問題がないか確認
  • ECRプッシュエラー: ECRリポジトリ名が正しいか確認
  • デプロイエラー: デプロイ先のサービス設定を確認

まとめ

GitHub ActionsとAWSを組み合わせることで、効率的なCI/CDパイプラインを構築できます。本記事で紹介した方法を応用することで、様々なAWSサービス(ECS、EKS、App Runner、Lambda)へのデプロイを自動化できます。

開発者はコードの品質向上に集中し、デプロイプロセスはGitHub Actionsに任せることで、効率的なソフトウェア開発サイクルを実現しましょう。

参考リソース

コメント

タイトルとURLをコピーしました