はじめに
現代のソフトウェア開発では、CI/CD(継続的インテグレーション/継続的デリバリー)パイプラインの構築が重要となっています。本記事では、GitHub Actionsを使用してDockerイメージをビルドし、AWSの各サービスへ自動デプロイする方法について解説します。
前提条件
- GitHubアカウント
- AWSアカウント
- ローカル環境にDockerがインストールされていること
- デプロイ対象のアプリケーションコード
全体の流れ
- DockerfileとアプリケーションコードをGitHubリポジトリに用意
- AWS ECR(Elastic Container Registry)の準備
- AWSへのデプロイ権限を持つIAMユーザーの作成
- GitHub SecretsにAWSの認証情報を設定
- GitHub Actionsワークフローの作成
- デプロイ先の準備(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リポジトリを作成します:
- AWSコンソールにログイン
- ECRサービスを選択
- 「リポジトリの作成」をクリック
- プライベートリポジトリを選択し、名前を入力(例:my-app)
- 作成ボタンをクリック
3. IAMユーザーの作成
GitHubからAWSリソースにアクセスするためのIAMユーザーを作成します:
- IAMコンソールに移動
- 「ユーザー」→「ユーザーを追加」をクリック
- 名前を入力(例:github-actions-user)
- アクセスキー – プログラムによるアクセスを選択
- 「次へ:アクセス権限」をクリック
- 「ポリシーを直接アタッチ」を選択
- 以下のポリシーを付与:
- AmazonECR-FullAccess
- デプロイ先に応じて追加のポリシー(例:AmazonECS-FullAccess)
- ユーザーを作成し、表示されるアクセスキーIDとシークレットアクセスキーを保存
4. GitHub Secretsの設定
GitHubリポジトリに認証情報を安全に保存します:
- GitHubリポジトリの「Settings」タブをクリック
- 左メニューから「Secrets and variables」→「Actions」を選択
- 「New repository secret」ボタンをクリック
- 以下のシークレットを追加:
AWS_ACCESS_KEY_ID
: IAMユーザーのアクセスキーIDAWS_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に任せることで、効率的なソフトウェア開発サイクルを実現しましょう。
コメント