EventBridge が API Gateway をサポートしました!

記事タイトルとURLをコピーする

はじめに

こんにちは、技術1課の山中です。 EventBridge が API Gateway をサポートしたとのことで、そもそも EventBridge とは?というところから調べてみました。

Integrating Amazon EventBridge and Amazon ECS | AWS Compute Blog

Amazon EventBridge とは

Amazon EventBridge (EventBridge) とは、アプリケーションを簡単に接続するためのサーバレスのイベントバスです。 特にサーバレスアプリケーションを作成する際にイベント駆動のアーキテクチャとして真ん中に Amazon SNS を配置するような構成が多くありましたが、イベントバスとして EventBridge を利用することで SaaS や他の AWS アカウントなどより柔軟なアーキテクチャの設計が可能となります。

Amazon EventBridge (サーバーレスイベントバスでアプリ同士を簡単に接続) | AWS

CloudWatch Events との違い

EventBridge は Amazon CloudWatch Events から派生・独立したサービスです。これまでの CloudWatch Events の機能に加え SaaS 連携の機能やユーザー独自のアプリケーションからイベントを受信できる機能が追加されています。 EventBridge は CloudWatch Events API を使用するため、既存の CloudWatch Events もそのまま利用できるようです。

イベント

EventBridge ではトリガとなるイベントをいくつか選択できます。 現在選択できるイベントは以下 3 つです。

  • AWS サービスのイベント
  • カスタムイベント
  • SaaS イベント

AWS サービスのイベント

各 AWS サービスの状態変化をイベントとしてトリガすることができます。 例えば、 EC2 が停止したことや、 CodePipeline のパイプラインがスタートしたことをトリガとすることが可能です。 サポートしているイベントについては、以下をご参照ください。 サポートされている AWS サービスからの EventBridge イベントの例 - Amazon EventBridge

カスタムイベント

ユーザーまたはアプリケーションから PutEvents API を呼び出すことで EventsBridge にイベントを送信できます。 よって、独自のカスタムアプリケーションと EventBridge を簡単に連携することができます。 イベント送信時にどのイベントバスに送信するか指定することが可能です。

SaaS イベント

EventBridge をサポートしている SaaS からのイベントをトリガとすることが可能です。 2020年7月現在、 Auth0 や Datadog、 OneLogin などの SaaS がサポートされています。 どの SaaS がサポートされているかは公式のドキュメントをご覧ください。 Amazon EventBridge の統合

ルール

イベントバスで受信したイベントのうちどのイベントをターゲットに送信するかを定義する規則です。 どんなイベントを、どのイベントバスを対象にし、どのターゲットに送信するか、などを定義できます。

ターゲット

ターゲットとは、イベントの送信先となり、イベントを処理するものです。 EventBridge のターゲットとしては Lambda 関数や EC2 インスタンスなどが指定できます。 Amazon EventBridge とは? - Amazon EventBridge

料金

EventBridge はイベントバスにパブリッシュされたイベントに対して課金されます。 東京リージョン での料金は以下のとおりです。

項目 料金
AWS のサービスイベント 無料
カスタムイベント 百万件の公開済みカスタムイベントごとに 1.00USD
サードパーティー (SaaS) のイベント 百万件の公開済みイベントごとに 1.00USD
クロスアカウントイベント 百万件の送信済みクロスアカウントイベントごとに 1.00USD

料金 - Amazon EventBridge | AWS

今回のアップデート

EventBridge のターゲットとして API Gateway が新たに指定できるようになりました。 これにより、各 AWS サービスや、カスタムアプリケーション、 SaaS サービスと既存のアプリケーションを API Gateway の API 経由で簡単に連携することが可能となります。 さらに、EventBridge 経由で API Gateway にアクセスすることで、 API Gateway の認証機能や呼び出しスロットルの制限などの機能を利用することが可能です。 今回は以下に従い、コンテナで動いている e コマースアプリケーションに対して EventBridge → API Gateway 経由で注文情報を連携し DB に登録する、という流れを試してみます。 Integrating Amazon EventBridge and Amazon ECS | AWS Compute Blog 手順は以下のとおりです。

  • Step1: ECR リポジトリの作成
  • Step2: アプリケーションのビルド
  • Step3: アプリケーションのコンテナ化
  • Step4: ECR リポジトリへ Docker イメージをアップロード
  • Step5: アプリケーションのデプロイ
  • Step6: アプリケーションのテスト

https://aws.amazon.com/jp/blogs/compute/integrating-amazon-eventbridge-and-amazon-ecs/

準備

アプリケーションをビルドしてデプロイするために、事前に以下をインストールしてください。

  • AWS CDK
  • JDK 11

チュートリアル用リポジトリのクローン

今回のチュートリアル用のリポジトリをクローンします。

$ git clone git@github.com:aws-quickstart/eventbridge-integration-solution-aws-api.git

Step1: ECR リポジトリの作成

Docker イメージアップロード用の ECR リポジトリを作成します。 該当のディレクトリに移動し、 Node.js の依存パッケージをインストールします。

$ cd eventbridge-integration-solution-aws-api/eventbridge-integration-solution-aws-api-cdk
$ npm install

次に、 CDK で ECR リポジトリ作成用のスタックをデプロイしましょう。

$ npm run build
$ cdk synth "*"
$ cdk bootstrap
$ cdk deploy EventsRegistry

ECR リポジトリが作成されました。

Step2: アプリケーションのビルド

続いて、アプリケーションをコンテナ化する準備としてビルドを行います。 Java のサンプルアプリケーションが用意されています。

$ cd ../eventbridge-integration-solution-aws-api
$ ./gradlew clean build

Step3: アプリケーションのコンテナ化

ビルドアーティファクトから新しいDockerイメージを作成するには、次のコマンドを実行します。

$ ./gradlew dockerBuildImage

実行すると eventbridge-integration-solution-aws-api というイメージが作成されます。

$ docker images
REPOSITORY                                                    TAG                 IMAGE ID            CREATED             SIZE
eventbridge-integration-solution-aws-api                      latest              c7b7e70f9d88        4 seconds ago       633MB

Step4: ECR リポジトリへ Docker イメージをアップロード

作成した Docker イメージを ECR リポジトリにプッシュしていきます。 まずは、認証トークンを取得し、レジストリに対して Docker クライアントを認証します。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin "${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com"

続いて、イメージにタグを付けます。

$ docker tag eventbridge-integration-solution-aws-api "${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/eventbridge-integration-solution-aws-api"

最後に ECR にプッシュします。

$ docker push "${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/eventbridge-integration-solution-aws-api"

Step5: アプリケーションのデプロイ

続いて、 CDK を使用してアプリケーションスタック全体をデプロイします。 このスタックには、以下のような AWS リソースが含まれます。

  • VPC
  • DocumentDB クラスタ
  • ECS タスク定義とサービス
  • ALB
  • API Gateway
  • EventBridge ルール
  • etc…

デプロイコマンドでデプロイしましょう。

$ cd ../eventbridge-integration-solution-aws-api-cdk
$ cdk deploy "*"

デプロイが完了すると、 EventBridge ルールが作成されターゲットに API Gateway が指定されています。

Step6: アプリケーションのテスト

最後にサンプルイベントを発行してテストしてみましょう。 event.json という名前のファイルを作成し、以下を貼り付けます。

[
  {
    "Source": "ecommerce",
    "DetailType": "CreateOrder",
    "Detail": "{\"order_id\": \"ce4fe8b7-9911-4377-a795-29ecca9d7a3d\",\"create_date\": \"2020-06-02T13:01:00Z\",\"items\": [{\"product_id\": \"b8575571-5e91-4521-8a29-4af4a8aaa6f6\",\"quantity\": 1,\"price\": \"9.99\",\"currency\": \"CAD\"}],\"customer\": {\"customer_id\": \"5d22899e-3ff5-4ce0-a2a3-480cfce39a56\"},\"payment\": {\"payment_id\": \"fb563473-bef4-4965-ad78-e37c6c9c0c2a\"},\"delivery_address\": {\"street\": \"510 W Georgia St\",\"city\": \"Vancouver\",\"state\": \"BC\",\"country\": \"Canada\",\"zip_code\": \"V6B0M7\"}}"
  }
]

CLI にてコマンドを実行し、イベントを送信します。

$ aws events put-events --entries file://event.json

送信後しばらく経つと API Gateway のリクエストカウントが 1 増加し、 EventBridge 経由で API Gateway にリクエストが送信されていることがわかります。

テストが終わったら、以下コマンドで環境をクリーンアップしてください。

$ cdk destroy "*"

おわりに

EventBridge を利用すればイベント駆動アーキテクチャの実装をより容易にすることができ、サービス間の結合をより疎結合とすることができます。 今回のようにターゲットにできるサービスが増えることで、より柔軟な設計ができそうです。

また、この内容は 2020/7/15(水) 18:00 よりYouTube にて配信する「30分でわかる AWS UPDATE!」で取り上げますので、是非ご覧ください! チャンネル登録よろしくおねがいします!! サーバーワークス チャンネル - YouTube

参考

SWX/BLOG

山中 大志(記事一覧)

アプリケーションサービス部

ビールと味噌カツをこよなく愛するエンジニアです。

AWSをみなさんにより使っていただけるような情報を発信していきたいと考えてます。