Server

EventBridge Pipesを使ってSQSからECSタスクを起動する

投稿日:

はじめに

AWSを使っていて、なにか非同期な処理を実行したい場合、SQSからLambdaをキックする方法が最も一般的な方法の一つではないかと思います。

しかし、何らかの事情(15分以内に終わらないなど)により、LambdaではなくECSタスクとして実行したいケースも存在するのではないでしょうか。

そのようなケースでは、EventBridge Pipesを使うことで容易に実現することができますので、EventBridge PipesとSQSとECSを組み合わせた場合の基本的な構成について紹介します。

EventBridge Pipesとは

EventBridge Pipesは、Producer/Consumer型のメッセージング処理を提供するAWSのサービスで、SQSやDynamoDBなどの様々なサービスとLambda、ECS、API Gatewayなどの様々なサービスを結びつけることができます。

EventBridge Pipesを構成する要素としては、以下のようなものがあります。

  • ソース
  • フィルタリング
  • エンリッチメント(プリプロセス)
  • ターゲット

EventBridge Pipesは、様々なソースからイベントデータを受け取り、必要に応じてそのデータをフィルタリングおよびエンリッチメントして、ターゲットに送信します。

フィルタリングとエンリッチメントについてはオプションとなっており、最低限、ソースとターゲットを指定する必要があります。

ソース

ソースは一連の処理の起点となるサービスのことです。

ソースとして指定できるサービスは以下のとおりです。

  1. Kinesis
  2. SQS
  3. DynamoDB
  4. MQ
  5. Apache Kafka
  6. MSK

フィルタリング

指定したフィルター条件を満たさないイベントデータを除外することができます。

フィルタリングで指定できるイベントパターンには以下のようなものがあります。

  • プレフィックスマッチング
  • サフィックスマッチング
  • 「以外」マッチング(ルールで指定されているもの以外のすべて)
  • 数値マッチング(特定の範囲内)
  • IPアドレスマッチング(CIDRで指定)
  • 存在マッチング(リーフノードに特定のフィールドを持たないすべて)
  • 大文字小文字を区別しないマッチング
  • 複数のマッチング(複数のマッチングルールの組み合わせ)
  • ORマッチング

イベントパターンはJSON形式で指定します。例えば、 detail.statusstopped および overloade 以外のイベントデータにマッチさせるイベントパターンの指定は以下のようになります。

ソースがSQSの場合、フィルター条件を満たさない場合は自動的にキューから削除されます。

また、メッセージのbodyの形式が文字列かJSONかによってイベントパターンの指定の仕方が変わるので、正しく指定しないと予期せぬ動作をする場合があります。

詳しくは公式ドキュメントをご覧ください。

エンリッチメント

エンリッチメントでは、ソースからのイベントデータをターゲットに送信する前に任意の処理を挟むことができます。

エンリッチメントとして指定できるサービスは以下のとおりです。

  • Lambda
  • Step Function
  • API Gateway
  • API送信先

エンリッチメントは同期的に呼び出されます。また、レスポンスサイズは最大で6MBまでに制限されています。

ターゲット

ターゲットはイベントデータを最終的に処理するサービスで、以下のようなサービスを指定することができます(一部抜粋)

  • API Gateway
  • バッチジョブのキュー
  • CloudWatchのロググループ
  • Lambda
  • ESCタスク

ソースがSQSのように順番を強制しない場合、EventBridgeでは、ターゲットを同期的、または非同期的に呼び出すことができます(デフォルトでは同期的に呼び出される)。

ECSタスクを起動する際にパラメータを渡したい場合、 ContainerOverridesCommand でコンテナに渡すことができます。

この設定に関しては、現時点ではコンソールからは行えないので、AWS CLIなどで設定を行います。

EventBridge Pipesを使うメリット

EventBridge Pipesを使うと、サービス間を疎に保つことができ、IAMで許可する権限を絞ることができます。

また、SQSとLambdaを組み合わせて非同期処理を実現する場合でも、EventBridge Pipesを使うことで、Lambdaの処理の中でSQSの操作をしなくて良くなる利点があります。

EventBridge Pipesの設定

それでは、実際のコンソールを使って構築していきます。

パイプの作成

AWSのコンソールでEventBridgeのページを開き、「パイプの作成」をクリックします。

「パイプ名」を入力し、「ソース」から「SQS」を選択し、「SQSキュー」を選択します(SQSキューは予め作成しておきます)。

「ターゲット」をクリックし、「ターゲットサービス」から「ECSクラスター」を選択し、「クラスター」や「タスク定義」などECSでタスクを立ち上げる際に設定するような項目を設定していきます(ECSの設定については、以前の記事をご覧ください)。

また、サブネットとセキュリティグループについては、カンマ区切りで入力します。

「ターゲット入力トランスフォーマー」を画像のように設定します。これはオプショナルなのでやらなくても大丈夫です。

設定が終わったら「パイプを作成」をクリックするとパイプが作成されます。

AWS CLIでパイプを更新する

先程説明した通り、SQSからのメッセージ中のパラメータをECSタスクに渡すには、 ContainerOverridesCommand にパラメータを入れる必要があります。これはコンソールからは設定できないので、以下のようにAWS CLIで設定を行います。

SQSからECSタスクを起動する

それでは、実際にSQSにメッセージを送信して、ECSタスクが起動するか確認します。

SQSの画面を開いて、作成したキューの画面の「キューの送受信」をクリックします。

「メッセージ本文」に入力して「メッセージ送信」をクリックします。

設定がうまくできていると、ECSの「クラスター」の「タスク」タブにタスクが表示されます。

タスクのログを見てみると、SQSから送信したメッセージ「foo」が出力されています。

ちなみに、ここで起動したタスクは、コマンド引数を表示するシンプルなコードです。

さいごに

EventBridge PipesとSQSとECSを使ったメッセージング処理の基本的な構築について紹介しました。

実際のサービスでは、同時に起動するタスクの上限を設定したり、フィルタリングやエンリッチメントなどを活用するなど、より高度な使い方をすることになるのではと思います。

フィルタリングとエンリッチメントについても少し触ってみましたが、うまく行かないところが多く、なれるまでもう少し触ってみる必要がありそうです。

また、以前はEventBridge Pipesのログを直接出力することができなかったので、デバッグに苦労していたようですが、最近の更新でCloudWatch Logsに出力できるようになりました。

EventBridge Pipesは、まだまだ発展途上のサービスだと思いますので、これからもっと便利に使い易くなっていくと嬉しいです。

おすすめ書籍

AWS運用入門 押さえておきたいAWSの基本と運用ノウハウ エバンジェリストの知識と経験を1冊にまとめた AWS開発を《成功》させる技術 AWSではじめるインフラ構築入門 第2版 安全で堅牢な本番環境のつくり方

blog-page_footer_336




blog-page_footer_336




-Server
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

mkcertで簡単にオレオレ証明書を発行する

1 はじめに2 前提3 mkcert3.1 概要3.2 インストール3.3 証明書作成3.4 証明書設置と設定3.5 接続確認4 さいごに5 おすすめ書籍 はじめに ローカルのwebサーバにhttps ...

DockerでLAMP環境をつくり、LimeSurveyを動かしてみた

1 はじめに2 Docker関連ファイルの作成2.1 docker-compose.yml2.2 MySQL2.2.1 個人的に詰まったこと2.3 PHP3 Docker起動4 リポジトリを作りました ...

配牌からアガれるかアガれないか予測する

1 はじめに1.1 趣旨1.2 筆者のスペック1.3 環境1.4 機能概要2 実装に関して2.1 教師データ2.2 前処理2.3 各ノードの重みの学習3 実際に使ってみた3.1 再テスト4 学習させた ...

aws

AWS LambdaとSQSでキューを処理する

1 はじめに1.1 今回紹介する内容2 Amazon SQSとは3 実際に動かしてみる3.1 SQSでキューを作成する3.2 LambdaでMessage送信関数を作成する3.2.1 sendMess ...

DockerでRuby2.5、Rails5.2betaの環境をつくる【Compose file v3】

1 はじめに2 Dockerのインストール3 ファイルの準備3.1 Gemfile3.2 Gemfile.lock3.3 Dockerfile3.3.1 Ruby(Rails)3.3.2 MySQL3 ...

フォロー

blog-page_side_responsive

2023年11月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。