はじめに
こんにちは、技術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 |
今回のアップデート
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
参考
- Integrating Amazon EventBridge and Amazon ECS | AWS Compute Blog
- Amazon EventBridge (サーバーレスイベントバスでアプリ同士を簡単に接続) | AWS
- よくある質問 - Amazon EventBridge | AWS