AWSと外部システムを「良い感じ」に連携する

こちらはエキサイトホールディングス Advent Calendar 2023の18日目の記事になります。

qiita.com

まず最初に、

「良い感じ」とは

この記事では、アプリケーション側の実装を最小限に抑えることを前提に話を進めます。

概要

AWSと外部システム(SaaSなど)間でのデータ連携方法ですが、AWSにはAppFlowやEventBridgeなどのサービスを利用する方法があります。
ユースケースに応じて適切な選択をするため、いくつかの事例を元に解説してみます。

ユーザの処理をトリガーにして非同期にデータを連携したい

EventBridgeはイベント駆動型アーキテクチャの実装をサポートするサービスです。
AWSのHealthイベントが発行されたらSlackに通知する、みたいなことをやっている方も多いと思われます。

そういったAWSのサービスが生成するイベントに加え、ユーザが独自に定義したカスタムイベントの発行も可能となっています。 実装は超シンプルで、PutEvents APIをコールするだけです。PHPのコード例は以下の通り。

$result = $client->putEvents([
    'Entries' => [
        [
            'EventBusName' => 'arn:aws:events:ap-northeast-1:123456789012:event-bus/hoge',
            'Detail' => json_encode($detail),
            'DetailType' => 'Excite Hoge Event',
            'Source' => 'excite.hoge'
        ]
    ]
]);

たったこれだけです(もちろんエラーハンドリングなどは別途必要ですが)
これにより、アプリケーションはイベント発行のみを行うだけで済み、後続処理については考慮する必要がなくなり、処理が疎結合になることでアプリケーションコードの保守性を高めることができます。

決まったタイミングに大量のデータを送受信したい

SaaSAWS間でデータを安全にやり取りするには、フルマネージド統合サービスであるAppFlowが適切です。

AppFlowを使ったデータ連携の例として、SalesforceからRedshiftへの問合せデータの取り込みや、ZendeskからS3へのチケットデータの取り込み、といった事例がよく上げられます。
2023年12月現在、80近くのアプリケーションがサポートされており、日本でも広く採用されているアプリケーションもあります。

AppFlowの良さは、接続設定の容易さにあると思っています。とにかく簡単です。
当然、OAuth 2.0など認証フローもサポートされています。
データが散らばっていて分析が困難になっている、データレイク(の手前となる基盤)を構築したい、などの要望にもサクッと対応できるかと思います。

外部サービスからイベントを受け取って処理を実行したい

  • Salesforce
  • Zendesk
  • Shopify
  • Datadog
  • New Relic
  • Auth0
  • KARTE
  • Mackerel

などのSaaSパートナーからイベントを受け取れます。
例えば、Auth0でのログインイベントを受取り、LambdaをキックしてRDSにログイン履歴として保存する、などといった実装も可能となります。

Salesforceの例ではイベントリレーの設定が必要になることもありますが、(個人的な意見として)これは少し設定が煩雑です。
もう一つの方法として、AppFlowでデータを受け取り、EventBridgeにペイロードすることもできます。
AWS側の設定でほぼ完結できるので、IaCで統一管理できるといったメリットもあります。

https://aws.amazon.com/jp/blogs/compute/building-salesforce-integrations-with-amazon-eventbridge/

まとめ

定期的に「相手」を確認する処理では、リアルタイム性が損なわれがちです。
しかし、すべての処理を同期的に行うとなるとアプリケーションコードが肥大化し、保守性が低下します。

イベント駆動型アーキテクチャは非同期処理を実装する選択肢の1つとなりますので、何かしらの参考になれば幸いです。