AWS Lake Formation のハイブリッドアクセスモードを利用する

2024.03.30

こんにちは、川田です。

今回は AWS Lake Formation のハイブリッドアクセスモードを利用してみます。AWS Big Data Blog の記事や公式ドキュメントを参考に、単一 AWS アカウントで設定する場合の作業を確認してみます。

AWS Big Data Blog: Introducing hybrid access mode for AWS Glue Data Catalog to secure access using AWS Lake Formation and IAM and Amazon S3 policies

AWS Glue リソースをハイブリッドリソースに変換する

Lake Formation のハイブリッドアクセスモードとは

ハイブリッドアクセスモードとは、Glue Data Catalog を利用している既存利用者に影響を与える事なく、新規利用者に向けて Lake Formation でのアクセス管理を設定できる機能です。以下、ハイブリッドアクセスモードが発表された際の What's New 記事より引用します。

AWS Lake Formation は AWS Glue データカタログのハイブリッドアクセスモードの一般提供を発表しました。この機能により、AWS Glue データカタログのデータベースとテーブルで Lake Formation を選択的に有効にできる柔軟性が得られます。今回のリリース前は、テーブルの既存のユーザー全員を 1 ステップで Lake Formation に移動する必要がありました。そのためには、データ所有者とデータコンシューマーの間である程度の調整が必要でした。ハイブリッドアクセスモードにより、他の既存のユーザーやワークロードを中断することなく、特定のユーザーセットに対して Lake Formation を有効にできる増分パスができました。

AWS Lake Formation が AWS Glue データカタログのハイブリッドアクセスモードを開始

ハイブリッドアクセスモードを利用しない場合

ハイブリッドアクセスモードを利用せずに Lake Formation でのアクセス管理を行いたい場合、既存の利用者の権限設定を、Glue や S3 向けの IAM・リソースベースのものから、Lake Formation 向けのものに変更する必要があります。

以下、公式ドキュメントや Workshop の資料を参考に、必要となる作業を洗い出してみます。

  1. 利用者の現在のアクセス権限 (IAMベース・リソースベース)を洗い出す
  2. Lake Formation にて、利用者の IAM User が Glue Database および Table にアクセスできるよう、適切な Lake Formation Permission(リソースベース or タグベース)設定をする
  3. 利用者の IAM User に、Lake Formation 利用向けの IAM Policy を付与する
  4. Lake Formation にて、Glue Table の Permission から IAMAllowedPrincipals グループ向けの Super 権限を削除する
  5. Lake Formation にて、Glue Database の Permission から IAMAllowedPrincipals グループ向けの Super 権限を削除する
  6. Lake Formation にて、Glue Database および Table の Data lake locations 情報(S3 の Path 情報)を登録する
  7. Lake Formation にて、新規 Glue Database および Table 作成時の IAMAllowedPrincipals 利用設定を停止する
  8. 利用者の IAM User に対し、不要となった Glue および S3 向けの IAM Policy・リソースベース Policy を削除する

AWS Lake Formation モデルに対する AWS Glue データの許可のアップグレード

AWS Lake Formation Workshop - Migrate Permissions

そもそも、利用者 * Glue テーブル分の権限設定を洗い出し、Lake Formation の Permission に移し替えていく作業となるので、なかなかに骨の折れる作業になると思われます。

事前環境

ハイブリッドアクセスモードを設定する前に、事前の環境として以下を用意しています。

AWS リソース 名前
Data Lake 向け S3 Objects s3://analytics-ap-northeast-1-zunda-demo/trip-data/
Glue Database demo
Glue Table trip_data_green
Glue Table trip_data_yellow
利用者向け IAM User analyst-aaa

S3 Objects。

$ aws s3 ls --recursive  s3://analytics-ap-northeast-1-zunda-demo/trip-data/
2024-03-27 01:44:13    1563684 trip-data/green/green_tripdata_2023-06.parquet
2024-03-27 01:43:45   54999465 trip-data/yellow/yellow_tripdata_2023-06.parquet

Glue テーブル。

$ aws glue get-tables --database-name demo --region ap-northeast-1 \
 | jq -r '.TableList[] | [.DatabaseName, .Name, .StorageDescriptor.Location] | @tsv'
demo    trip_data_green s3://analytics-ap-northeast-1-zunda-demo/trip-data/green/
demo    trip_data_yellow        s3://analytics-ap-northeast-1-zunda-demo/trip-data/yellow/

利用者 analyst-aaa は Athena を介して Data Lake にアクセスします。analyst-aaa の IAM User には、Lake Formation 関連の IAM Policy は付与せず、必要となる Athena, Glue, S3 向けの Policy を付与させています。


Lake Formation 側では、以下の準備のみを実施しています。

Lake Formation ハイブリッドアクセスモードの設定

実際にハイブリッドアクセスモードを設定していきます。

検証の方法として、既存利用者 analyst-aaa の設定はそのままに、新規利用者 analyst-bbb を用意し、こちらを Lake Formation でのアクセス管理としてみます。

新規利用者向け IAM User の作成

新規利用者 analyst-bbb の IAM User を作成します。ペルソナに推奨される許可 - データアナリストの許可 を参考に、必要となる IAM Policy を付与します。

$ aws iam create-user --user-name analyst-bbb
$ aws iam create-login-profile --user-name analyst-bbb --password *******
$ aws iam attach-user-policy --user-name analyst-bbb --policy-arn arn:aws:iam::aws:policy/AmazonAthenaFullAccess
$ policy=$(cat <<-EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess",
                "glue:GetTable",
                "glue:GetTables",
                "glue:SearchTables",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:GetPartitions",
                "lakeformation:GetResourceLFTags",
                "lakeformation:ListLFTags",
                "lakeformation:GetLFTag",
                "lakeformation:SearchTablesByLFTags",
                "lakeformation:SearchDatabasesByLFTags"
            ],
            "Resource": "*"
        }
    ]
}
EOF
)
$ aws iam put-user-policy --user-name analyst-bbb --policy-name pol-lf-data-analyst --policy-document "${policy}"
$ policy=$(cat <<-EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:StartTransaction",
                "lakeformation:CommitTransaction",
                "lakeformation:CancelTransaction",
                "lakeformation:ExtendTransaction",
                "lakeformation:DescribeTransaction",
                "lakeformation:ListTransactions",
                "lakeformation:GetTableObjects",
                "lakeformation:UpdateTableObjects",
                "lakeformation:DeleteObjectsOnCancel"
            ],
            "Resource": "*"
        }
    ]
}
EOF
)
$ aws iam put-user-policy --user-name analyst-bbb --policy-name pol-lf-data-analyst-lf --policy-document "${policy}"
$ # Athena Query の出力先として s3://aws-athena-query-results-* を設定(必要に応じ、環境にあったバケット名に変更する)
$ policy=$(cat <<-EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Put*",
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::aws-athena-query-results-*"
        }
    ]
}
EOF
)
$ aws iam put-user-policy --user-name analyst-bbb --policy-name pol-athena-result-bucket --policy-document "${policy}"

重要な点が、Data Lake の S3 Objects s3://analytics-ap-northeast-1-zunda-demo/trip-data/ 向けのアクセス権を付与していない事です。そのため、この状態で Athena からクエリを実行しても AccessDenied となります。

Lake Formation の IAMAllowedPrincipals グループについて

ハイブリッドアクセスモードを設定する前に、Lake Formation で用意されている IAMAllowedPrincipals グループの仕組みについて触れます。

まず、現時点で Lake Formation に登録されているテーブルでは、以下の設定になっています。

  • Data access mode が Lake Formation 外 (Other) となっている
  • Lake Formation Permission の影響を受けるユーザーがいない (Lake Formation permissions enforced for が No users である)

続いて、Lake Formation の Permissions 設定を確認すると、以下となっています。Principal IAMAllowedPrincipals グループに Permissions All が与えられています。

IAMAllowedPrincipals グループの説明について、公式ドキュメントより引用します。

Lake Formation sets Super permission on all databases and tables in the Data Catalog to a group called IAMAllowedPrincipals by default. If this group permission exists on a database or a table, all principals in your account will have access to the resource through the IAM principal policies for AWS Glue. It provides backward compatibility when you start using Lake Formation permissions to secure the Data Catalog resources that were earlier protected by IAM policies for AWS Glue.


Lake Formation は、デフォルトで Data Catalog 内のすべてのデータベースとテーブルの Super 権限を IAMAllowedPrincipals というグループに設定します。このグループ権限がデータベースやテーブルに存在する場合、アカウント内のすべてのプリンシパルは、AWS Glue の IAM プリンシパルポリシーを通じてリソースにアクセスできます。これは、以前は AWS Glue 用の IAM ポリシーで保護されていた Data Catalog リソースを保護するために Lake Formation 権限を使用し始めたときの下位互換性を提供します。


When you use Lake Formation to manage permissions for your Data Catalog resources, you need to first revoke the IAMAllowedPrincipals permission on the resources, or opt in the principals and the resources to hybrid access mode for Lake Formation permissions to work.


Lake Formation を使用して Data Catalog リソースのパーミッションを管理する場合、Lake Formation のパーミッションを機能させるには、まずリソースの IAMAllowedPrincipals パーミッションを取り消すか、プリンシパルとリソースをハイブリッドアクセスモードにオプトインする必要があります。

Lake Formation permissions reference - Principal is an IAM group - IAMAllowedPrincipals

記載ある通り、ハイブリッドアクセスモードを利用しない場合、IAMAllowedPrincipals グループ向けの権限を取り外さないと Lake Formation での Permissions 設定が機能しません。しかし一方で、IAMAllowedPrincipals グループ向けの権限を取り外すと、下位互換性が維持されなくなり、IAM ポリシー(とリソースベースポリシー)で設定していた権限が無効となる事になります。つまり、必要な権限設定を全て Lake Formation 側に移す必要がでてきます。

そこでハイブリッドアクセスモードを利用する事になる訳です。

ハイブリッドアクセスモードを設定する

それでは、上記で作成した analyst-bbb ユーザー向けに、ハイブリッドアクセスモードを設定していきます。以降で実行している AWS CLI コマンドは、すべてデータレイク管理者の IAM User にて実行されているものになります。

Data lake locations の登録

Data lake の S3 Path 情報を、Data lake locations にハイブリッドアクセスモードにて登録します。今回は検証目的として、trip_data_green テーブル側の Path のみを登録します。

$ aws lakeformation register-resource --region ap-northeast-1 \
--resource-arn arn:aws:s3:::analytics-ap-northeast-1-zunda-demo/trip-data/green \
--use-service-linked-role \
--hybrid-access-enabled

タグベースの Lake Formation Permissions を設定

今回利用する LF-Tag の Key と Value {"demo": ["green", "yello"]} を登録します。

$ aws lakeformation create-lf-tag  --region ap-northeast-1 \
--tag-key demo \
--tag-values green yellow

trip_data_green テーブルに、登録したタグ demo を value が green を条件として割り当てます。

$ aws lakeformation add-lf-tags-to-resource --region ap-northeast-1 \
--resource '{ "Table": {"DatabaseName":"demo", "Name":"trip_data_green"}}' \
--lf-tags TagKey=demo,TagValues=green

IAM ユーザー analyst-bbb 向けに、{"demo": "green"} のタグベースで Permissions を付与します。

$ json=$(cat <<-EOF
{
    "Principal": {
        "DataLakePrincipalIdentifier": "arn:aws:iam::123456789012:user/analyst-bbb"
    },
    "Resource": {
        "LFTagPolicy": {
            "ResourceType": "DATABASE",
            "Expression": [
                {
                    "TagKey": "demo",
                    "TagValues": [
                        "green"
                    ]
                }
            ]
        }
    },
    "Permissions": [
        "DESCRIBE"
    ]
}
EOF
)
$ aws lakeformation grant-permissions --region ap-northeast-1 --cli-input-json "${json}"
$
$ json=$(cat <<-EOF
{
    "Principal": {
        "DataLakePrincipalIdentifier": "arn:aws:iam::123456789012:user/analyst-bbb"
    },
    "Resource": {
        "LFTagPolicy": {
            "ResourceType": "TABLE",
            "Expression": [
                {
                    "TagKey": "demo",
                    "TagValues": [
                        "green"
                    ]
                }
            ]
        }
    },
    "Permissions": [
        "DESCRIBE", "SELECT"
    ]
}
EOF
)
$ aws lakeformation grant-permissions --region ap-northeast-1 --cli-input-json "${json}"

Lake Formation permissions 強制のオプトイン

ハイブリッドアクセスモードを利用する場合、Lake Formation 側の権限で管理したい principal と、その principal がアクセスするリソースの情報をオプトインする必要があります。今回の場合、analyst-bbb ユーザーが demo.trip_data_green テーブルへのアクセス時に Lake Formation permissions を強制するようオプトインを実行します。

$ aws lakeformation create-lake-formation-opt-in --region ap-northeast-1 \
--principal DataLakePrincipalIdentifier=arn:aws:iam::123456789012:user/analyst-bbb \
--resource '{ "Table": { "DatabaseName": "demo", "Name": "trip_data_green" }}'

以上で必要な設定は完了です。

設定の確認

設定後の Lake Formation の画面を確認しておきます。

Lake Formation に登録されているテーブルの情報が、以下の設定に変わっています。

  • trip_data_green テーブルの Data access mode が Hybrid Access となっている
  • Lake Formation Permission の影響を受けるユーザーが Some users となっている

Lake Formation Permissions の情報は以下となっています。

  • IAMAllowedPrincipals グループが demo データベース内のテーブルに All 権限を持っている(変化なし)
  • analyst-bbb ユーザーが、タグベースの Permissions を持っている

オプトインした情報の確認をしてみます。上記でコマンド実行した内容が登録されています。

Athena からの検索結果を確認

Athena からクエリを実行し、正しくアクセス管理を行えているか確認します。

analyst-bbb ユーザーで AWS コンソールにログインします。

demo.trip_data_green テーブルに対してクエリを実行します。成功します。

demo.trip_data_yellow テーブルに対してクエリを実行します。こちらは Lake Formation Permissions を設定していないため失敗します。


続いて analyst-aaa ユーザーで AWS コンソールにログインします。

demo.trip_data_green テーブルに対してクエリを実行します。成功します。これは IAMAllowedPrincipals グループの設定を介して Lake Formation Permissions を設定がバイパスされ、既存で設定されている IAM・リソースベースのポリシーにてアクセス権を取得しているからとなります。

補足: Lake Formation の Data Catalog settings について

Lake Formation の Data Catalog settingsDefault permissions for newly created databases and tables のチェックボックスは、新規で作成されたデータベースとテーブルに対する IAMAllowedPrincipals グループの設定動作を指定するものです。

このチェックボックスをアンチェックすると、新規で作成されたデータベースとテーブルには IAMAllowedPrincipals グループの Permission 設定が登録されないようになります。もし以降に作成されるデータベースとテーブルのアクセス権を Lake Formation 管理としたい場合、アンチェックしておく必要があります。