1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Day 22: CI/CDパイプラインを構築する:GitHub ActionsとAWS CodePipeline - Day 22: CI/CDパイプラインを構築する:GitHub ActionsとAWS CodePipeline

Posted at

Day 22: CI/CDパイプラインを構築する:GitHub ActionsとAWS CodePipeline 🚀

皆さん、こんにちは!30日集中講座、Day 22へようこそ。

これまでの講座で、ローカル開発からクラウドデプロイまでを手動で行う方法を学びました。しかし、実際の開発現場では、コードの変更を自動的に検知し、テスト、ビルド、デプロイまでを一貫して自動化する仕組みが必要です。これが、 CI/CD (Continuous Integration/Continuous Delivery) パイプラインです。

今日は、CI/CDの概念を理解し、代表的なツールであるGitHub Actionsを使って、ECRへのイメージプッシュを自動化するパイプラインを構築する方法を学びます。


1. CI/CDパイプラインとは?

CI/CDパイプラインは、ソフトウェア開発における以下のプロセスを自動化するワークフローです。

  • CI (継続的インテグレーション): 開発者がコードをリポジトリにプッシュするたびに、自動的にテストとビルドを実行するプロセスです。
  • CD (継続的デリバリー/デプロイメント): CIが完了したビルド成果物を、自動でステージング環境や本番環境にデプロイするプロセスです。

CI/CDパイプラインを構築することで、開発者はデプロイの複雑さから解放され、より多くの時間を機能開発に集中できるようになります。

2. CI/CDツール:GitHub Actions vs AWS CodePipeline

コンテナデプロイメントのCI/CDパイプラインを構築する際に、よく使われるツールを比較してみましょう。

項目 GitHub Actions AWS CodePipeline
中心となるプラットフォーム GitHub AWS
主なユースケース GitHubリポジトリを起点とした柔軟なワークフロー AWSサービス(CodeBuild, CodeDeployなど)をフル活用したパイプライン
パイプラインの定義 .github/workflows/下のYAMLファイル AWSコンソールまたはCloudFormation/CDK

今回は、GitHubリポジトリを起点とするGitHub Actionsを使って、ECRへのイメージプッシュを自動化するワークフローを構築します。


3. GitHub Actionsでコンテナパイプラインを構築する

前提条件と準備

この演習を始める前に、以下の準備が完了していることを確認してください。

  • Day 6で作成したPythonアプリケーションのコードがGitHubリポジトリにプッシュされていること。
  • AWS ECRリポジトリが事前に作成されていること。

ECRリポジトリがまだ作成されていない場合は、以下のコマンドで作成しておきましょう。

# ECRリポジトリの作成(AWS CLI)
aws ecr create-repository --repository-name my-web-app --region ap-northeast-1

ステップ1: GitHubシークレットの設定

AWSの認証情報をGitHubに安全に保管するため、リポジトリの「Settings」→「Secrets and variables」→「Actions」で、以下のシークレットを設定します。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGION
  • ECR_REPOSITORY (my-web-appのようにECRで作成したリポジトリ名と一致させてください)

💡 セキュリティの注意点
ECRへのイメージプッシュにはAdministratorAccessのような広範な権限は不要です。 AmazonEC2ContainerRegistryFullAccess など、必要最小限の権限を持つ専用IAMユーザーを作成して使用しましょう。

ステップ2: GitHub Actionsワークフローの作成

リポジトリのルートディレクトリに、.github/workflows/ci.ymlというファイルを作成し、以下の内容を記述します。

name: CI to ECR

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  workflow_dispatch:

jobs:
  build_and_push:
    name: Build and Push to ECR
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        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: Run tests (if available)
        run: |
          if [ -f "requirements.txt" ]; then
            pip install -r requirements.txt
          fi
          if [ -f "requirements-dev.txt" ]; then
            pip install -r requirements-dev.txt
            python -m pytest tests/ || echo "No tests found or tests failed, but continuing..."
          else
            echo "No test dependencies found, skipping tests"
          fi

      - name: Build, tag, and push image to Amazon ECR
        if: github.event_name == 'push' && github.ref == 'refs/heads/main'
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest

このワークフローは、以下のタイミングで実行されます:

  • push: mainブランチへのプッシュ時(テスト + ビルド + プッシュ)
  • pull_request: mainブランチへのプルリクエスト時(テストのみ実行)
  • workflow_dispatch: GitHubのUIから手動で実行可能

4. 動作確認と検証

ステップ3: 動作確認

ワークフローが正常に動作したかを確認しましょう。

  1. GitHub Actionsの確認: GitHubリポジトリの「Actions」タブでワークフローの実行状況を確認。緑のチェックマークが表示されれば成功です。
  2. ECRでのイメージ確認: AWS CLIでイメージを確認します。
    aws ecr list-images --repository-name my-web-app
    
    latest<commit-sha>の2つのタグが付いたイメージが確認できるはずです。
  3. ローカルでのテスト(オプション)
    プッシュされたイメージをローカルで実行し、正しく動作するか確認できます。
    aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com
    docker run -p 8080:8080 <account-id>.dkr.ecr.ap-northeast-1.amazonaws.com/my-web-app:latest
    
    <account-id>は実際のAWSアカウントIDに置き換えてください。

5. トラブルシューティング

💡 よくある問題と解決方法

  • 権限エラー: Error: Cannot perform an interactive login from a non TTY device
    • 解決方法: IAMユーザーにAmazonEC2ContainerRegistryFullAccess権限が付与されているか確認。
  • リポジトリが見つからない: Error: The repository with name 'my-web-app' does not exist
    • 解決方法: ECRリポジトリ名とワークフロー内のECR_REPOSITORYが一致しているか確認。
  • Dockerfileが見つからない: Error: unable to prepare context: unable to evaluate symlinks in Dockerfile path
    • 解決方法: Dockerfileがリポジトリのルートディレクトリに存在するか確認。

6. ベストプラクティスと次へのステップ

🚀 実践のベストプラクティス

  • IAM権限の最小化: ECR専用のIAMポリシーを作成し、必要最小限の権限のみを付与。
  • ブランチ戦略: developブランチでのテスト → mainブランチでの本番デプロイという流れを検討。
  • シークレットの管理: AWS認証情報は定期的にローテーションしましょう。

📚 用語集

  • ワークフロー: GitHubで実行される一連の自動化されたプロセス(YAMLファイルで定義)。
  • ジョブ: ワークフロー内の実行単位(通常は1つの仮想マシン上で実行)。
  • ステップ: ジョブ内の個別のタスク。
  • アクション: 再利用可能なコードの単位(usesで呼び出し)。
  • シークレット: GitHubに暗号化して保存される機密情報。

これで、皆さんはCI/CDの基本を学び、ローカルのコード変更が自動でクラウドに反映される仕組みを構築する第一歩を踏み出しました。明日は、この自動化されたデプロイメントを監視し、問題を早期発見するためのモニタリング手法を学びます。


次回の予告

Day 23: コンテナのモニタリングとログ管理:Amazon CloudWatchとPrometheus

それでは、また明日お会いしましょう!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?