[アップデート] AWS Data Exchange が組織間データ共有招待をサポートしたので S3 で使ってみた

2023.12.15

いわさです。

本日のアップデートで AWS Data Exchange でデータセットを別組織の AWS アカウントに対してアクセス許可する機能が追加されました。

アナウンスを見てみると、どうやら期限指定でのアクセス許可が可能、アクセス許可には許可と承諾のフローが必要だったりと、実際に組織間でデータセットを共有する際によく求められそうな機能をいくつか有していそうなことがわかりました。

これは AWS Data Exchange 今後活用するシーンが増える可能性があるなと思い、アクセス許可設定を試してみましたので紹介します。

データセットを作成

まずは別アカウントへ共有したいデータセットを作成したいと思います。
色々なデータセットのタイプがあるのですが、本日はシンプルに Amazon S3 バケットとオブジェクトを作成し、それをアセット化して Data Exchange のアクセス許可機能を使って共有してみます。

続いて、データセット(カタログ)化します。
所有データセットメニューから「データセットを作成」を選択します。

はじめにデータセットタイプを選択するのですが、今回は Amazon S3 データアクセスを選択しました。
これ API Gateway とか Lake Formation のデータ許可まで一元的にこのサービスから行えるの良いですね。

続いて、データセットの定義を行います。
アカウントを指定して共有する形ではありますが、サブスクライバーがカタログを識別するための情報として入力します。
説明欄ではマークダウン形式で少しリッチな表現を行うことも出来ます。

データセットに含めるデータソースを指定してます。
ここでは Amazon S3 バケットを選択するのですが、次のように追加操作を行い、右側に追加対象として表示されている必要があります。

S3 データアクセスの場合は追加のデータアクセス設定を行います。
おそらくここはデータソースによって異なっていそうで、S3 データアクセスの場合だとリクエスタ支払いを設定することが可能です。これはおもしろいですね。
リクエスタ支払いというのは Amazon S3 バケットの機能で、S3 バケットのクロスアカウントアクセスが発生する際に生じる料金を、バケット所有アカウントかリクエストしたアカウントか、どちらで担うかをコントロール出来る機能です。

Data Exchange を通してデータソースのネイティブ機能を有効化出来るのはおもしろい。
今回はリクエスタ支払い機能は無効化しましたが、有効化が推奨されてるのですね。Data Exchange がサブスクライバーへ向けたカタログサービスとして使うことが想定されているからでしょうか。

S3 バケットの場合はバケットポリシーの設定が必要です。
ポリシーを Data Exchange コンソールからコピーします。

S3 バケットポリシーを設定します。
他にもオブジェクト所有者や暗号化方式などいくつか前提条件があるので併せて確認しましょう。
なお、バケットポリシーはアクセス許可したい AWS アカウントを設定する必要はありません。アクセス許可先の追加に伴って個別にバケットポリシーを変更しなくて良いのはメリットですね。

最後にアセット作成操作を確定させると、作成ジョブが進行します。
今回だと数十秒から数分待つとジョブが完了しました。

作成完了後、所有データセットにてデータセットを確認することが出来ました。
また、ステータスが「共有する準備ができました」となっていることも確認出来ます。

データセットを別アカウントへ許可

作成したデータセットに別 Organizations の関係のないアカウントからのアクセス許可を設定してみたいと思います。
先程と同じデータセットを所有しているアカウントで「Sent data grants」を選択します。 

対象データセットを選択する画面で、共有準備が完了した先程のデータセットを選択します。

続いて、招待する外部 AWS アカウント ID を入力します。
また、アクセス期限を設定することも出来ます。今回は期限なしで設定しました。

送信した招待履歴はタブから確認することが出来ます。

別アカウントで承認しアクセスしてみる

「Received data grants」メニューには送信された招待を確認することが出来ます。
先程招待を受けたアカウントでアクセスしてみると、承認保留中の招待を確認することが出来ました。

ちなみに、まだ招待を承認していない状態の場合は「権限を持つデータ」一覧には何もデータセットが表示されていませんでした。

選択して「Accept data grant」ボタンを押します。
確認メッセージなどは表示されずにすぐに承認処理が開始されました。

こちらの承認処理も数十秒から数分の時間がかかります。
途中、次のようなメールを AWS Marketplace 名義で受信しました。

承認処理が完了すると、Accepted and expired data grants タブに承認済みの招待が表示されるようになりました。

そして、権限を持つデータセットに、別アカウントからアクセス許可されたデータセットが表示されるようになりました。

こちらの詳細画面を確認すると S3 アクセスポイントのエイリアスが確認出来ると、こちらに AWS CLI でアクセスしてみます。

% aws s3api list-objects --bucket b9525565-725c-4c94-9-wdmm6yo6nbwgx1ash5mhyqjwwdxtsapn1b-s3alias --profile hogeadmin
{
    "Contents": [
        {
            "Key": "hoge.csv",
            "LastModified": "2023-12-15T00:50:15+00:00",
            "ETag": "\"8bd937dea09254b6a1725f7571995a2b\"",
            "Size": 51,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "members-30312",
                "ID": "76c32f5081dc4906984229846e5ed7ee77257da3c7405e56f73f39afd6801fb5"
            }
        }
    ],
    "RequestCharged": null
}

外部アカウントの IAM で、Data Exchange のアクセス許可経由で S3 バケットにアクセスさせることが出来ました。

さいごに

本日は AWS Data Exchange が組織間データ共有招待をサポートしたので S3 で使ってみました。

S3 バケットのクロスアカウント共有自体はやろうと思えば Data Exchange 不要で出来るのですが、アセットとして管理して、アクセス許可の管理などを出来る点は Data Exchange を使う価値がありそうかなと思いました。

API Gateway をこういう形でアクセス許可させるパターンは初めて知ったので、ユースケースなど調べてまた別の切り口のブログでも書けたらなと思ってます。