SRE兼スクラムマスターのブログ

チーム開発が好きなエンジニアブログです。検証した技術やチームの取り組みを書いていきます。

【備忘録】Github ActionsでEB CLIを使いたい

GitHub Actionsを使っていて、少しハマったのでメモを残しておきます。

やりたいこと

  • Github Actions を使って ElasticBeanstalk へデプロイする

困ったこと

やったこと

Github ActionsにEB コマンドをインストール

pipで手動インストールします。

...
      - name: SetUp python
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Install awsebcli
        run: |
          pip install awsebcli
          echo "~/.local/bin" >> $GITHUB_PATH
...

eb cliはOIDCとの親和性もOK。

EB CLIの初期化

EB CLI自体はインストール可能になりましたが、eb init を実行しない限り環境設定がされていないため、エラーが出てまだebコマンドは使えません。 eb init コマンドはインタラクティブな設定方法であるため、自動化環境上での実行は難しいです。

eb init実行時には、コマンドを実行したディレクトリで .elasticbeanstalk/config.yml が生成されます。これをあらかじめ用意しておくことで、eb init を実行しなくても eb cli を初期化できます。

config.yml

branch-defaults:
  default:
    environment: test-environment
environment-defaults:
  test-environment:
    branch: null
    repository: null
global:
  application_name: test-application
  default_platform: XXXXX
  default_region: ap-northeast-1
  profile: null
  sc: null

これでebコマンドが実行できるようになりました。 GitHub Actions OIDC を利用したデプロイは最終的に下記のようになりました。

name: eb-deploy

on: [ workflow_dispatch ]

env:
  AWS_ROLE_ARN: "XXXXX"
  AWS_REGION : "XXXXX"
  ELASTIC_BEANSTALK_NAME: "XXXXX"
  APPLICATION_NAME: "XXXXX"

permissions:
  id-token: write
  contents: read

jobs:
  aws-deploy:
    runs-on: ubuntu-latest
    steps:          
      - name: Checkout
        uses: actions/checkout@v2

      - name: SetUp python
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Install awsebcli
        run: |
          pip install awsebcli
          echo "~/.local/bin" >> $GITHUB_PATH

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_REGION }}
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          role-session-name: preDeploySession

      - name: Deploy
        env:
          F_TIME: "${{ steps.current-time.outputs.formattedTime }}"
        run: |
          eb deploy ${{ env.ELASTIC_BEANSTALK_NAME }} --timeout 30
          aws elasticbeanstalk describe-environments --environment-names ${{ env.ELASTIC_BEANSTALK_NAME }}