GitHub Actionsの機能を使って、Amazon EventBridge(Amazon CloudWatch Events)にイベントを送信してみた

2019.11.01

AWS事業本部の梶原@福岡オフィスです。

GitHub Actionsの機能を使って、Amazon EventBridge(Amazon CloudWatch Events)にイベントを送信してみましたのでGitHub Actionsのサンプルコードを共有します。
GitHubとAWSを連携させる際はCodePipelineのGitHub連携機能や、GitHubからWebHook(API-Gateway)の機能を使って連携する方法もありますのでご興味がある方はそちらもご参照ください
実際のところは、GitHub Actionsを使ってみたかった&Amazon EventBridgeの機能をちょっと試してみたく、やってみました。

事前準備

GitHub Actionsのパブリックβ申請

現在GitHub Actionsの機能はパブリックベータの位置づけとなります。 使用する際は、アカウントより申請を行ってください。申請が許可されれば使用可能になります。

https://help.github.com/ja/github/automating-your-workflow-with-github-actions/about-github-actions

追記:Github Actionsですが正式にGAされましたので、申請は必要がなくなりました。(2019/11/14)

AWSアカウント(API アクセスキーの準備)

GitHub ActionsからAWSのイベントを登録するさいにAWS CLIを使用しますので、IAMユーザーを作成して アクセスキー(ACCESS_KEY_ID)、またシークレットアクセスキー(SECRET_ACCESS_KEY)を取得してください 今回は作成したユーザーへ割り当てるポリシーはAWS 管理ポリシーのAmazonEventBridgeFullAccessを割り当てていますが、必要に応じて、適切な権限を割り当ててください。 AmazonEventBridgeのputEventsの権限がないとイベントを呼ぶことができないのでご注意ください

GitHub Secrets への登録

GitHub Actionsから環境変数としてSecretsを参照します。 ここでは前項で、取得した、ACCESS_KEY_ID, SECRET_ACCESS_KEY をそれぞれ、AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEYとして登録します。

GitHub Actionosの中から環境変数としてそれぞれ

env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

のように参照し、GitHub Actionsの環境変数として使用することが可能になります。

GitHub Actions の作成

New Workflow

  1. GitHub Actionsを作成したいリポジトリの'Actions'を選択し、'New workFlow' を選択します
  2. 中身を書き換えるので、なんでもいいのですが、AWS CLIを使用するため、Python package を選択します。
  3. '.github/workflows/push-events.yaml' として以下ファイルを編集します。
  4. 中身の変更が終わりましたら、commit(push)してください。
  5. Github Actionsが動き始めて、Amazon EventBridgeにイベントがpushされます
name: EventBridge push Events Sample

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 1
      matrix:
        python-version: [3.7]

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install awscli
    - name: aws events put-events
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: |
        aws events put-events --region ap-northeast-1 \
          --entries '[{"Time": "2016-01-14T01:02:03Z", "Source": "com.mycompany.myapp", "Resources": ["resource1", "resource2"], "DetailType": "myDetailType", "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }"}]'
    - name: aws events put-events
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: |
        aws events put-events --region ap-northeast-1 --entries file://putevents.json

2度イベントを投げていますが、ほぼ同じ内容をローカルファイルに保存したjsonからイベントとしてコールしているものとなりますので、使いやすい方をご使用ください

putevents.json

[
  {
    "Source": "com.mycompany.myapp",
    "Detail": "{ \"key1\": \"value1\", \"key2\": \"value2\" }",
    "Resources": [
      "resource1",
      "resource2"
    ],
    "DetailType": "myDetailType"
  }
]

動作確認

Amazon EventBridge からのAWSリソースの呼び出し 上記だけだとEvents が呼ばれるだけで、あまり意味がないので、Amazon EventBridgeのルールを作成して、SNS等に内容を連携します。

以下、メール等で受信した場合、Message部分に送信したイベントが入ります。

{
  "Type" : "Notification",
  "MessageId" : "1350f9ac-96ff-5257-bf1b-XXXXXX",
  "TopicArn" : "arn:aws:sns:ap-northeast-1:XXXXXXXXXXXXXX:XXXXX",
  "Message" : "{\"version\":\"0\",\"id\":\"d9adce87-b6da-265e-bb04-443942a9b4fb\",\"detail-type\":\"myDetailType\",\"source\":\"com.mycompany.myapp\",\"account\":\"
  \",\"time\":\"2019-10-31T14:49:36Z\",\"region\":\"ap-northeast-1\",\"resources\":[\"resource1\",\"resource2\"],\"detail\":{\"key1\":\"value1\",\"key2\":\"value2\"}}",
  "Timestamp" : "2019-10-31T14:49:37.854Z",
  "SignatureVersion" : "1",
  "Signature" : "iAa5X7iWMt7f5xj0xBZEyHrU4p8yOzuvSnDYx0Lrbd3OXRliuWZUJYSr3a5hO1HHVze+3zpDCc0kBAnZCpJzcyYqHTfqX+3wghny5r5oqqV4QZL58neGWrm0hwboRHZPRJDW2xPF6lJALwY9X1xeYFbRLSnfQrNf9sNUjitGOYTzzEXujoJ/vLBbMp3QVWgV6OHR6wlLT1EExnJYtSetaLvg/PUdDbgi7Auef46d6Rydb/hVDYxpx9ImtMxZlsiFMOw1CY3q0TNUB/QODGvGsOydKzNwzA==",
  "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-x.pem",
  "UnsubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:xxxxxxxxxxxxxxxxx:11eaa764-1f9f-4d51-b4c5-xxxxx"
}

まとめ

ちょっと、小ネタに近いですが、GitHub Actionsを使用してみました。 GitHub Actions自体がパブリックベータなので、実際のプロダクション環境で使用はむずかしいかと思いますが、 GitHubの何らかの動作(push, pullrequest)のタイミングでAWSのサービスを動かしたい! というときに役に立つ場面がでてくるかと思います。

また、Amazon EventBridge から連携できるAWSのサービスも充実していくかと思いますので この機構を元にして、ちょっと便利なツールを作っていこうと思います。

参考

【GitHub】新GitHub Actionsを使ってAWS ECRにイメージをプッシュするCIを作ってみた https://qiita.com/homines22/items/af96baa6ba51b1d59124

AWS CLI put-events https://docs.aws.amazon.com/cli/latest/reference/events/put-events.html