【AWS】Elastic BeanstalkにGitHub Actionsで自動デプロイする

AWS

AWSのElastic BeanstalkアプリケーションをGitHub Actions経由で自動デプロイする設定と実施の記録です。

前提条件

  • Elastic Beanstalkのアプリケーションを初回デプロイ済
  • 自動デプロイ用のAWSユーザーは未作成
  • GitHubリポジトリ作成済

AWSの自動デプロイ用のユーザー作成

AWSのサイトにログインし、IAMのコントロールパネルを開きます。

メニューから「ユーザー」を選択します。

「ユーザーの作成」ボタンをクリックします。

わかりやすいユーザー名を入力して「次へ」ボタンをクリックします。

今回はユーザー名を「eb_deploy_github」としておきます。

「許可のオプション」で「ポリシーを直接アタッチする」を選択します。

「許可ポリシー」では、次の2つを選択してから「次へ」ボタンをクリックします。

  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkManagedUpdatesCustomerRolePolicy

確認画面の内容を確認してから「ユーザーの作成」ボタンをクリックします。

ユーザー一覧に表示されたユーザー名をクリックして詳細を開きます。

「アクセスキーを作成」のリンクをクリックします。

「ユースケース」の箇所で「コマンドラインインターフェイス(CLI)」にチェックをします。

「上記のレコメンデーションを理解し、アクセスキーを作成します。」にチェックをしてから「次へ」ボタンをクリックします。

説明を入力してから「アクセスキーを作成」ボタンをクリックします。

※UTF-8とか言われてますが、Windowsの入力はShift-JISで面倒なので英語にします。

アクセスキー作成直後の画面はすぐには閉じないでください。

ここで必ず「アクセスキー」と「シークレットアクセスキー」をコピーして控えておきましょう。

ここでコピーし損ねると二度とコピーできず、新しいアクセスキーを作成し直すことになります。

GitHubリポジトリのシークレット登録

先程作成したAWSのデプロイ用ユーザーのアクセスキーとシークレットアクセスキーをGitHubリポジトリのシークレットとして登録していきます。

GitHubリポジトリを開き、「Settings」タブを開きます。

サイドメニューの「Secrets and variables」から「Actions」を選択します。

「New repository secret」ボタンをクリックします。

「Name」欄には「AWS_ACCESS_KEY_ID」を入力し、

「Secret」欄には、先程AWSで作成した「アクセスキー」を入力して

「Add secret」ボタンをクリックします。

再度、「New repository secret」ボタンをクリックします。

「Name」欄には「AWS_SECRET_ACCESS_KEY」を入力し、

「Secret」欄には、先程AWSで作成した「シークレットアクセスキー」を入力して

「Add secret」ボタンをクリックします。

「AWS_ACCESS_KEY_ID」と「AWS_SECRET_ACCESS_KEY」の2つが登録されました。

GitHubワークフローの作成

ローカルでリポジトリのコンテンツを更新したら、

プロジェクトトップに「.github/workflows/」フォルダを作成し、

その中にGitHubワークフローのファイルを作成します。

名前は適当で良いですが、ここでは「aws_eb_deploy.yml」としておきます。

ワークフローの内容は、以下のサイトからのコピペを修正していきます。

Beanstalk Deploy - GitHub Marketplace
Deploy a zip file to AWS Elastic Beanstalk

▼修正後の内容:

※注:ブランチ名は「main」に修正

※注:「actions/checkout」は「v4」に修正

※注:バージョン名はpackage.jsonから取得

※注:デプロイ用ZIPは親ディレクトリに作成

※注:「application_name」を修正

※注:「environment_name」を修正

※注:「region」を修正

name: Deploy main
on:
  push:
    branches:
    - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:

    - name: Checkout source code
      uses: actions/checkout@v4

    - name: Get Version From Package JSON
      id: new-version
      run: |
        echo version=$(cat package.json | grep version | head -1 | grep -Po '\d+\.\d+\.\d+') >> $GITHUB_OUTPUT

    - name: Show New Version
      run: echo "version=${{ steps.new-version.outputs.version}}"

    - name: Generate deployment package
      run: zip -r ../deploy${{ steps.new-version.outputs.version}}.zip . -x '*.git*'

    - name: Deploy to EB
      uses: einaregilsson/beanstalk-deploy@v21
      with:
        aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        application_name: getting-started-app2
        environment_name: Getting-started-app2-env
        version_label: ${{ steps.new-version.outputs.version}}
        region: ap-northeast-1
        deployment_package: ../deploy${{ steps.new-version.outputs.version}}.zip

アプリケーション名、環境名、リージョン、バージョンラベル等は適宜修正してください。

この内容で保存したら、コミットしてGitHubリポジトリにプッシュし、プルリクエストを作成します。

プルリクエストをマージしてみる

作成されたプルリクエストをmainブランチへマージしてGitHub Actionsを自動実行させます。

エラー無く、無事デプロイ完了したようです。

トータル51秒ですね。

AWS Elastic Beanstalk側の環境パネルでイベントの確認もしてみます。

エラーや警告は見られませんね。

一応、本番のコンテンツ表示も確認してみます。

AWSデフォルトのnode.jsサンプルアプリを少しだけ修正したものです。左側のメッセージが更新されています。

というわけで、GitHub経由でElastic Beanstalkアプリの自動更新ができました。

以降の更新作業

上記は初回設定と疎通確認でした。

以降、アプリの更新と自動デプロイの手順は、

  • GitHubリポジトリをローカルにプル
  • ローカルでアプリ更新、テスト、コミット
  • GitHubリポジトリにプッシュ
  • GitHubリポジトリでプルリクエスト作成
  • GitHubリポジトリでプルリクエストをマージ
  • GitHub Actionsの結果を確認
  • AWS Elastic Beanstalkのイベントとヘルスを確認
  • 本番サイトの表示を確認

といったところでしょうかね。

以上、お疲れさまでした。

コメント

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