本日も乙

ただの自己満足な備忘録。

GitHub Actions から AWS CodePipeline のパイプラインを実行する

AWS CodePipeline(以下、CodePipeline)は GitHub と連携した場合、通常は Push 時にパイプラインが実行されますが、Push 以外のイベント時にパイプラインを実行したい場合もあります。例えば、特定のタグを付けたり、Pull Request 作成時やコメントをつけた場合などです。

Push 以外のイベントでパイプラインを実行したい場合は CodePipeline の Webhook を設定する方法がありますが、イベントのフィルタを書いたり動作検証するのが面倒です。

GitHubのpush以外のWebHookイベントからCodePipelineを発火させる - Qiita

Github の Pull Request がマージされたときに CodePipeline を発火させる - Qiita

そこで本記事は GitHub Actions から CodePipeline のパイプラインを実行する方法を紹介します。GitHub Actions であれば、ワークフローのトリガーを簡単に設定できます。

AWS アクセスキーの発行

GitHub Actions から CodePipeline のパイプラインを実行するための AWS アクセスキーを作成する必要があります。まずは以下の権限で IAM ユーザを作成します。IAM ポリシーはインラインでも管理ポリシーでも構いません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codepipeline:StartPipelineExecution"
            ],
            "Resource": [
                "arn:aws:codepipeline:<REGION>:<AWS_ACCOUNT_ID>:<PIPELINE_NAME>"
            ]
        }
    ]
}

<REGION> はリージョン名、<AWS_ACCOUNT_ID> は AWS アカウント ID、<PIPELINE_NAME> は CodePipeline のパイプライン名に置き換えてください。

今回はパイプライン名を hoge-pipeline としました。

例: arn:aws:codepipeline:ap-northeast-1:123456789012:hoge-pipeline

GitHub Actions の設定

ここから GitHub Actions の設定をしていきます。すでに Marketplace に公開されている GitHub Actions を使います。

github.com

まず、先ほど作成した AWS アクセスキーを GitHub の Secrets に格納します。GitHub リポジトリの [Settings] タグから [Secrets] を選択し、以下の名前で AWS アクセスキーとシークレットキーを保存します。

  • AWS_PIPELINE_ACCESS_KEY : AWS アクセスキー
  • AWS_PIPELINE_SECRET_KEY : AWS シークレットキー

github-actions

GitHub リポジトリの .github/workflows/codepipeline.yml(ファイル名は任意)に以下のような設定を入れます。今回は簡単に main ブランチへの Push 時にワークフローを実行するようにしました。このファイルを Commit、Push しておきます。

name: Deploy by Codepipeline

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Trigger AWS CodePipeline
      # v1.0.7
      uses: zulhfreelancer/aws-codepipeline-action@492467f78d67ac2301e55e208326a8e9fbd23284
      with:
        aws-region: 'ap-northeast-1'
        aws-access-key: ${{ secrets.AWS_PIPELINE_ACCESS_KEY }}
        aws-secret-key: ${{ secrets.AWS_PIPELINE_SECRET_KEY }}
        pipeline-name: 'hoge-pipeline'

AWS CodePipeline の設定

このままだと GitHub Actions と CodePipeline の Webhook で二重にパイプラインが実行されてしまうため、CodePipeline で Push 時にパイプラインを実行しないように設定します。

CodePipeline の Source の編集画面を開き、アクションプロバイダーを [GitHub (バージョン 1)] にして、検出オプションを [AWS CodePipeline] にします。

codepipeline-source

保存時に CodePipeline の Webhook を削除するかの確認がでますので [保存] をクリックします。

delete-webhook

aws codepipeline delete-webhook を実行して Webhook が無いことを確認します。もし残っていたら aws codepipeline delete-webhook で削除します。

これだけだと、ポーリングによってパイプラインが実行されてしまうため、PollForSourceChangesfalse にすることでポーリングを無効化します。

現在のパイプラインの設定を JSON ファイルで出力します。

$ aws codepipeline get-pipeline --name hoge-pipeline > pipeline.json

pipeline.json を編集し PollForSourceChangesfalse にします。

"configuration": {
    "Branch": "main",
    "OAuthToken": "****",
    "Owner": "ohsawa0515",
    "PollForSourceChanges": "false",
    "Repo": "hoge-repo"
},

一番下にある metadata を削除します。

# これを削除
"metadata": {
    "pipelineArn": "arn:aws:codepipeline:ap-northeast-1:123456789012:hoge-pipeline",
    "created": "2020-12-21T21:07:11.043000+09:00",
    "updated": "2021-01-13T20:50:15.671000+09:00"
}

aws codepipeline update-pipeline で更新します。

$ aws codepipeline update-pipeline --cli-input-json file://pipeline.json

# 確認
$ aws codepipeline get-pipeline --name hoge-pipeline \
  --query 'pipeline.stages[?name==`Source`].actions[].configuration[]'
[
    {
        "Branch": "main",
        "OAuthToken": "****",
        "Owner": "ohsawa0515",
        "PollForSourceChanges": "false",
        "Repo": "hoge-repo"
    }
]

実行

以上で設定が終わりです。動作確認をします。今回は空コミットして Push します。

$ git commit --allow-empty -m "github actions test"
$ git push origin

Actions タブから実行結果を確認できます。

github-actions

参考URL