Amazon EventBridge で Adobe パートナーイベントソースを統合してみた #AWSreInvent

2023.12.09

いわさです。

Amazon EventBridge にはパートナーイベントソースという機能があり、EventBridge 経由でサポートされている外部 SaaS との間でイベントドリブンなアプリケーション統合を行うことが出来ます。

このパートナーイベントソースに、先日の AWS re:Invent 2023 期間のアップデートで Stripe と Adobe が追加されました。

Stripe に関しては Stripe 側がまだプライベートベータ中でブログ執筆が難しい状況だったのですが、Adobe については利用可能な状態だったので試してみました。

Adobe Developer Console でイベントを構成する

まず、Adobe には Creative Cloud や Experience Cloud などいくつかのスイートがあり、その中から更に必要なプロダクトを選んで使用します。

開発者は Adobe Developer Console を通して Adobe API を操作したり、あるいはイベントを利用したアプリを作成することが出来ます。

AWS と EventBridge で連携するにあたって、Adobe Developer Console のプロジェクトでイベントを構成することが必要となるのですが、このあたりの手順は AWS 公式ドキュメント側には記載がなくて、パートナー公式ドキュメントに構成方法が記述されています。Adobe だと以下のページとなります。

任意のプロジェクトでイベントを追加します。

どのプロダクトのイベントを追加するか選択します。

そのプロダクトの中でどういったイベントを使うかも選択します。
今回は Creative Cloud のライブラリイベントを対象としてみました。

イベントを認証する方法を選択します。
このあたりの考え方がちょっと難しいのですが、今回は OAuth を使って Adobe ID のユーザーの同意を得たデータを取得する方法を使ってみました。

実際にアプリに組み込む際はアプリケーション URL へリダイレクトさせてユーザーの認可操作をさせるなど、データ取得のフローを考える必要があるのですが、今回は検証用なのでなんでも良いです。
Web App を選択します。

リダイレクト URL などは検証用に存在しないものをここでは入力しました。
トークンを取得して API を使う場合などは適切なリダイレクト先が必要なのですが、今回の検証範囲ではユーザー同意操作のみ出来れば良いので適当なものにしています。

OAuth の設定後に、イベント受信方法を選択可能です。
従来までも Webhook などで受信する仕組みは用意されていたようなのですが、今回のアップデートにあわせて Amazon EventBridge が構成できるようになっています。

必要な情報は連携先の AWS アカウント ID と、リージョンのみです。

一旦 Adobe Developer Console 上から Amazon EventBridge への連携設定を行いました。
この時点ではまだステータスが Pending であることに注意してください。

ユーザー同意操作を行っておく

私はここの手順が最初わからずにかなりハマったのですが、AWS と Adobe 間の連携設定は簡単に設定できるのですが Adobe 側でイベントを補足するまでにもうひと手間必要です。

先程設定したイベントの OAuth クライアント ID を取得します。

ユーザー同意を得る必要があり、次のドキュメントに従って構成設定を行います。
具体的には、今回は検証用途だったので次のように URL へクライアント ID を設定したものをブラウザでリクエストして、Adobe 側の認証・認可を行いました。

Adobe Consent API To authenticate your app to receive events on your users' behalf (and for development purposes), you must provide consent via the Adobe Consent API:

https://ims-na1.adobelogin.com/ims/authorize/v1?response_type=code&client_id=api_key_from_console&scope=AdobeID,openid,creative_sdk

You will need to replace api_key_from_console with the Client ID value provided on the Credentials tab of the Registration Details in your Console project.

リクエストすると次のように認証操作を要求されます。

認証に成功すると、要求スコープに応じた認可要求が発生しますので同意します。
先程作成した OAuth クライアントに対して、自分のイベント検出を許可したことになります。

Amazon EventBridge を構成する

Adobe Developer Console での連携設定によって、指定した AWS アカウント、リージョンに次のようにパートナーイベントソースが作成されていることが確認できるはずです。

AWS 側での操作はこれを選択してイベントバスと関連付けるだけです。

ちなみに、ここで保留中だったイベントソースをイベントバスへ関連付けすると、Adobe Developer Console 上でも次のようにステータスが Active に変更されます。

イベントを受信してみる

関連付けしたイベントバスにルールを作成してイベントが受信できるか確認してみます。

イベントパターンについては EventBridge パートナーにすでに Adobe が追加されていましたのでそちらからまず開始し、実際に受信されたイベントを見ながらカスタマイズすると良いと思います。
デフォルトでは次のパターンが用意されていましたので、今回はこちらを使いました。

では Adobe 側で操作を行ってみましょう。
今回は Creative Cloud でライブラリを新規作成してみます。

EventBridge ルールでは適当に SNS へ送信されるようにアクションを設定しました。
Creative Cloud 側でライブラリ作成後、すぐに次のようなイベントを受信しました。

{
    "version": "0",
    "id": "04f6cbef-d7ae-ac8b-426c-f405ee28f0c4",
    "detail-type": "Creative Cloud Libraries:cc_library_created",
    "source": "aws.partner/developer.adobe.com/195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
    "account": "123456789012",
    "time": "2023-12-09T04:33:21Z",
    "region": "ap-northeast-1",
    "resources": [],
    "detail": {
        "data": {
            "xdmEntity": {
                "event:resources": {
                    "http://ns.adobe.com/adobecloud/rel/metadata/repository": {
                        "event:action": "created",
                        "event:embedded": {
                            "_links": {
                                "http://ns.adobe.com/adobecloud/rel/ac/check": [
                                    {
                                        "href": "https://platform-cs-jpn3.adobe.io/content/acl/check/urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F{?privilege,relation}",
                                        "templated": true
                                    }
                                ],

:

                                "http://ns.adobe.com/adobecloud/rel/repository": {
                                    "href": "https://platform-cs.adobe.io/content/directory/repo/urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F/repositoryResource"
                                },
                                "version-history": [
                                    {
                                        "href": "https://platform-cs-jpn3.adobe.io/content/storage/id/urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F/:versions",
                                        "mode": "id"
                                    },
                                    {
                                        "href": "https://platform-cs-jpn3.adobe.io/content/storage/relpath/urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F/assets/adobe-libraries/f7fd9769-9b21-46d0-af36-198d62ac0365/:versions",
                                        "mode": "path"
                                    }
                                ]
                            },
                            "repo:assetId": "urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                            "repo:state": "ACTIVE",
                            "repo:createDate": "2023-12-09T04:33:21.195Z",
                            "repo:repositoryId": "urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                            "repo:name": "195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                            "dc:format": "application/vnd.adobe.library+dcx",
                            "repo:createdByClientId": "CCXWeb1",
                            "repo:ancestors": [
                                "urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                                "urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                                "urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F"
                            ],
                            "storage:region": "JPN3",
                            "repo:createdBy": "720829A76427C00E0A495C8C@AdobeID",
                            "repo:modifiedBy": "720829A76427C00E0A495C8C@AdobeID",
                            "repo:size": 0,
                            "repo:assetClass": "composite",
                            "repo:path": "/assets/adobe-libraries/195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                            "repo:createdByIpAddress": [
                                "203.0.113.1"
                            ],
                            "storage:assignee": {
                                "id": "720829A76427C00E0A495C8C@AdobeID",
                                "type": "user"
                            },
                            "storage:deviceCreateDate": "2023-12-09T04:33:21.195Z",
                            "repo:modifiedByClientId": "CCXWeb1",
                            "repo:modifyDate": "2023-12-09T04:33:21.195Z",
                            "storage:deviceModifyDate": "2023-12-09T04:33:21.195Z",
                            "repo:id": "urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
                            "repo:modifiedByIpAddress": [
                                "203.0.113.1"
                            ]
                        },
                        "event:resourceGeneration": 24
                    }
                },
                "event:sequence": -1,
                "event:repository": {
                    "repo:owner": {
                        "id": "HOGEHOGEHOGEHOGEHOGEHOGE@AdobeID",
                        "type": "user"
                    }
                }
            }
        },
        "id": "195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
        "source": "urn:uuid:urn:aaid:sc:AP:195D9BC2-5885-4924-B7C6-0443A4BE7E1F",
        "specversion": "1.0",
        "type": "com.adobe.platform.events.cc_library_created",
        "datacontenttype": "application/json",
        "dataschema": "http://ns.adobe.com/adobecloud/repository/event/asset",
        "time": "2023-12-09T04:33:21.195Z",
        "xactionid": "5AdrL4hbwk5MU4QWaDzBccQTstHD5SPq_ty6l-4-SC-4",
        "recipient": {
            "userid": "HOGEHOGEHOGEHOGEHOGEHOGE@AdobeID"
        },
        "dataschemaversion": "0.9"
    }
}

さいごに

本日は Amazon EventBridge で Adobe パートナーイベントソースを統合してみました。

Adobe と統合したイベント駆動アプリケーションを作成したい時に使えそうです。
一例としてEventBridge コンソール上では、Adobe Commerce で発生したイベントを EventBridge を使って AWS 上でホスティングしている ERP へ送信するアーキテクチャーが紹介されていました。