クロスアカウントアクセスとは
ログ収集AWSアカウント(データレイクAWSアカウント)のデータカタログを、別のAWSアカウントからアクセスして利用する。
S3上の実データもGlueデータカタログのテーブル情報などのメタデータもログ収集アカウントにある状態で、別のAWSアカウントからリソースリンク(シンボリックリンクみたいな定義)を介して権限制御しつつアクセスできる。
例えばログ収集AWSアカウントのGlueテーブルを、別のAWSアカウントのAthenaで使いクエリ実行する。
前提環境
- AWSアカウントA:ログ収集用アカウント
- AWSアカウントB:それ以外の自社サービスで使うアカウント
アカウントAの操作
アカウントAの状況
Athenaでクエリできている
S3にデータがあり、Glueでデータベースやテーブルを作成し、以下のようにAthenaでクエリができる状態
データベース名:default
テーブル名:in0
Glueでテーブル確認
LakeFormationで権限管理されている
DataLakeLocationに、データがあるS3パスが登録されている
この登録したS3パスに対してLakeFormationはアクセス許可を行える
DataLocationsでロールにS3パスへのアクセス許可を与えている
Glueクローラがテーブル作成するために、Glueクローラが使うロールにアクセス許可を与えている
共有する
IAMAllowedPrincipalsの許可削除
IAMAllowedPrincipalsに対しての許可があると今回の共有ができないので、これらを削除します。
このプリンシパルは従来のIAMのみのアクセス制御との後方互換のためにあるので実際やる時はご注意ください。
ここでは、IAMAllowedPrincipalsが含まれた許可が2つあります。defaultデータベースへの許可とin0テーブルへの許可です。それらを削除(Revoke)します。
データベース側に「Use only IAM access control for new tables in this database」(このデータベースの新しいテーブルにIAMAllowPrincipalsを付ける)の設定があるか確認します。あればチェックを外しておきます
今回はdefaultという名前のデータベース
アカウントBに共有する
DataPermissionsで[Grant]をクリックする。
"External account"にチェックを入れ、AWS account IDでアカウントBのIDを選択する。
※同じAWS Organizationに属するアカウントだとリストに表示されます。そうでない場合はRAM(AWS ResourceAccessManager)で共有する必要があります。
データベースは共有したいデータベースのdefault、テーブルは全てとしました。Permissionもテストなのでとりあえず全部チェック入れます。
Permissionが作成されるとこんな感じです。
プリンシパルがAWSアカウントBで、アカウントBがアカウントAがオーナーのテーブルにアクセスする許可を与えています。
(補足)今回スイッチロールして各AWSアカウントにログインしています。IAMAllowedPrincipalsを削除したので、アカウントAで行っていたAthenaでのクエリは失敗します。引き続きAthenaでクエリする必要があれば、スイッチロールに使っているロールに引き続きAthenaクエリできるように許可付与します。
アカウントBの操作
データベースやテーブルを確認
共有されたアカウントAのデータベースやテーブルが確認できる。
Resource Linkの作成
Resource Linkというものを作ります。元のデータ/テーブルを指し示すシンボリックリンクみたいなものでしょうか?
作成すると普通にテーブルのように見えます。テーブルの[Create]をクリックし、以下の値を入力し[Create]をクリックします。
- Resource linkにチェック
- Resource link name:share-in0 (なんでもいい)
- Database:lf01 (Resource linkを保存するアカウントBのデータベース)
- Shared table:in0 (アカウントAの共有したテーブルin0)
作成されたResource Linkです。share-in0という名前です。わかりやすく"share-in0"という名前のフォントが少しイタリックっぽくなっています。
View Dataしてみます。これはAthenaでのクエリ実行です。
アカウントBからAthenaでResource Linkを使い、アカウントAのデータをクエリできました。
ログ
CloudTrailのログも指定したアカウントに集約できそうです。
レイクフォーメーションは、データレイク内のデータへのすべてのクロスアカウントアクセスの集中監査証跡を提供します。受信者のAWSアカウントが共有テーブルのデータにアクセスすると、レイクフォーメーションはCloudTrailイベントを所有アカウントのCloudTrailログにコピーします。コピーされたイベントには、Amazon AthenaやAmazon Redshift Spectrumなどの統合サービスによるデータに対するクエリ、およびAWS Glueジョブによるデータアクセスが含まれます
こちらも是非
公式ドキュメント(クロスアカウントアクセス)
https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/access-control-cross-account.html
公式ドキュメント(AWSアカウント間でデータカタログなどの共有)
https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/sharing-catalog-resources.html
公式ドキュメント(リソースリンクの作成)
https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/creating-resource-links.html
Lake Formationの使い方まとめ
https://qiita.com/pioho07/items/76554a7ac4252858b450
Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f