【AWS】Glue Crawler のロールとポリシーの設計

AWS Glue Crawler のロールとポリシーの設計について解説します。

 

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

【AWS】Glue Job のロールとポリシーの設計

 

 

そもそも Glue 関連のサービスで IAM ロールの設定と IAM ポリシーの設定をしなければいけないものは何か?

Glue 関連のサービスと言ってもたくさんありますが、そもそもGlue 関連のサービスで IAM ロールの設定と IAM ポリシーの設定をしなければいけないものは何でしょうか?

考え方ですが、IAM ロールは Glue ジョブや Glue Crawler のように S3 や RDS や Redshift など他の AWS リソースへアクセスする可能性があるサービスに設定します。(設定できます)

 

一方で、Glue データカタログなどのテーブル情報などのメタデータを保存するようなサービスには設定できません。(保存するだけで自分からは他にサービスに対してアクションすることがないから)

 

例えば、その他に IAM ロールを指定可能な Glue 関連サービスとしては以下のようなものがあります。

 

■Glue Interactive Session

  • Glue Studio からジョブ作成時に指定可能な Jyptter Notebook を利用したインタラクティブな開発ノートブック

 

■Glue DataBrew

  • Project
  • Job (ProfileJob/RecipeJob)

■参考サイト

AWS Glue インタラクティブセッションの概要

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/interactive-sessions-overview.html

 

Creating and using AWS Glue DataBrew projects

https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/projects.html

 

Creating, running, and scheduling AWS Glue DataBrew jobs

https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/jobs.html

 

 

AWS Glue について

まずはそもそも Glue とは何をしているのでしょうか。

ETL と言うと分かりやすいですが、Glue だけだと分かりにくいですよね。

 

AWS Blackbelt に分かりやすい構成図と説明があります。

 

[AWS Black Belt Online Seminar] AWS Glue

https://d1.awsstatic.com/webinars/jp/pdf/services/20190806_AWS-BlackBelt_Glue.pdf

 

 

全体の処理の流れ

Glueが中心となってデータソースからターゲットへデータをETL処理を実施して移行するといったイメージです。

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

 

 

Glue Crawlerの処理の流れ

次に Glue Crawler の処理の流れです。

Crawler(クローラー)がデータソースのメタデータをクロールします。

 

AWS Glue の概念

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/components-key-concepts.html#components-data-store

 

  • データストア ← データを永続的に保存するリポジトリです。例として S3、RDS などがあります。
  • データソース ← プロセスまたは変換への入力として使用されるデータストアです。
  • データターゲット ← プロセスまたは変換の書込み先であるデータストアです。

Glue の入力で使用される S3 などのデータストアをデータソースと言います。

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

 

 

Crawler(クローラー)がデータカタログに登録・更新し、メタデータを管理します。

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

Glue Crawler はデータソースのメタデータをクロールしてデータカタログに登録したり更新したりしてメタデータを管理をするという処理を実行します。難しそうに見えますがやっていることはシンプルですね。

 

 

クローラー(Glue Crawler)

Glue Crawler は Glue Data Catalog にメタデータを作成します。

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

 

 

データカタログ(Glue Data Catalog)

AWS Glue の持続的なメタデータストアです。

これには、AWS Glue 環境を管理するためのテーブル定義、ジョブ定義、およびその他のコントロール情報が含まれています。

各 AWS アカウントには、リージョンごとに 1 つの AWS Glue Data Catalog があります。

 

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

 

 

 

Glue Crawler の構成図と設計

Glue Crawler の構成図です。

データソースは S3(data-lake-snapshot-rds-test-s3)です。

RDS のスナップショットを S3 にエクスポートしています。

 

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

 

 

■構成図

【AWS】RDSのSnapshotをS3バケットにエクスポートする方法

 

設計

  • RDSのスナップショットをS3バケットにエクスポートしている。
  • S3バケットをデータソースとする。
  • Glue Crawler(data-lake-test-crawler)がデータソースをクロールする。
  • クロールしたメタデータをデータカタログ(data-lake-test-datacatalog)に登録する。
  • IAMロール(data-lake-test-crawler-role)を作成し Glue Crawler に割り当てる。
  • IAMロール(data-lake-test-crawler-role)には Glue Crawler を実行する権限、データソースの S3 バケットにアクセスする権限、KMS キーにアクセスする権限を割り当てる。

 

 

IAMロール、IAMポリシーの作成

具体的に IAM ロール、IAM ポリシーを作成します。

 

■信頼ポリシー


  “Version”: “2012-10-17”, 
  “Statement”: [ 
    { 
      “Effect”: “Allow”, 
      “Principal”: { 
        “Service”: “glue.amazonaws.com” 
      }, 
      “Action”: “sts:AssumeRole” 
    } 
  ] 
}

 

まずは IAMロール(data-lake-test-crawler-role)に割り当てる信頼ポリシーです。

Glue Crawler に権限を委譲するので「glue.amazonaws.com」を付与します。

 

 

 

■AWSGlueServiceRole(マネジメントポリシー)


    “Version”: “2012-10-17”, 
    “Statement”: [ 
        { 
            “Effect”: “Allow”, 
            “Action”: [ 
                “glue:*”, 
                “s3:GetBucketLocation”, 
                “s3:ListBucket”, 
                “s3:ListAllMyBuckets”, 
                “s3:GetBucketAcl”, 
                “ec2:DescribeVpcEndpoints”, 
                “ec2:DescribeRouteTables”, 
                “ec2:CreateNetworkInterface”, 
                “ec2:DeleteNetworkInterface”, 
                “ec2:DescribeNetworkInterfaces”, 
                “ec2:DescribeSecurityGroups”, 
                “ec2:DescribeSubnets”, 
                “ec2:DescribeVpcAttribute”, 
                “iam:ListRolePolicies”, 
                “iam:GetRole”, 
                “iam:GetRolePolicy”, 
                “cloudwatch:PutMetricData” 
            ], 
            “Resource”: [ 
                “*” 
            ] 
        }, 
        { 
            “Effect”: “Allow”, 
            “Action”: [ 
                “s3:CreateBucket” 
            ], 
            “Resource”: [ 
                “arn:aws:s3:::aws-glue-*” 
            ] 
        }, 
        { 
            “Effect”: “Allow”, 
            “Action”: [ 
                “s3:GetObject”, 
                “s3:PutObject”, 
                “s3:DeleteObject” 
            ], 
            “Resource”: [ 
                “arn:aws:s3:::aws-glue-*/*”, 
                “arn:aws:s3:::*/*aws-glue-*/*” 
            ] 
        }, 
        { 
            “Effect”: “Allow”, 
            “Action”: [ 
                “s3:GetObject” 
            ], 
            “Resource”: [ 
                “arn:aws:s3:::crawler-public*”, 
                “arn:aws:s3:::aws-glue-*” 
            ] 
        }, 
        { 
            “Effect”: “Allow”, 
            “Action”: [ 
                “logs:CreateLogGroup”, 
                “logs:CreateLogStream”, 
                “logs:PutLogEvents” 
            ], 
            “Resource”: [ 
                “arn:aws:logs:*:*:/aws-glue/*” 
            ] 
        }, 
        { 
            “Effect”: “Allow”, 
            “Action”: [ 
                “ec2:CreateTags”, 
                “ec2:DeleteTags” 
            ], 
            “Condition”: { 
                “ForAllValues:StringEquals”: { 
                    “aws:TagKeys”: [ 
                        “aws-glue-service-resource” 
                    ] 
                } 
            }, 
            “Resource”: [ 
                “arn:aws:ec2:*:*:network-interface/*”, 
                “arn:aws:ec2:*:*:security-group/*”, 
                “arn:aws:ec2:*:*:instance/*” 
            ] 
        } 
    ] 
}

 

次に Glue Crawler を実行するのでマネージドポリシーである「AWSGlueServiceRole」を割り当てます。

名前は Role で終わってますがポリシーです。

権限を確認すると”glue:*”と Glue 全体の権限が割り当てられていて、且つリソースも「*」になっています。

そのため、もっと絞れます。絞るとしたら権限で絞るよりプロジェクトごとにリソースで絞った方が管理しやすいかと思います。

 

 

S3 バケットへの権限

 

■data-lake-test-crawler-role-s3-policy


   “Version”: “2012-10-17”, 
    “Statement”: [ 
        { 
          “Effect”: “Allow”, 
          “Action”: [ 
              “s3:GetObject” ← ”s3:PutObject”権限は不要。
          ], 
          “Resource”: [ 
              “arn:aws:s3:::data-lake-snapshot-rds-test-s3/*” 
          ] 
        } 
    ] 
}

 

次にデータソースの S3 バケットへアクセスするためのポリシーを作成します。

Glue Crawler がデータソースをクロールするので S3 への権限(クロールするだけなので”s3:GetObject”があればOK)が必要です。

 

クローラーの前提条件

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/crawler-prereqs.html

 

 

AWS の公式サイトを確認すると「s3:PutObject」も割り当てられていますが、Delta Lake データストアをクロールする場合のみです。

S3バケットをクロールするだけなら”s3:GetObject”があればOKです。

 

List権限は必要か?

List権限まで必要かどうかは Glue Crawler の設定次第になりそうです。

Crawler のデータソースを S3 として、S3 のパスに S3 バケットもしくはフォルダを指定する場合、内部に含まれるファイルを検索するために s3:ListBucket の権限が必要となります。

ただし S3 パスに特定ファイルのパスを指定し、単一ファイルのみをクロールする場合には、s3:ListBucket の権限は必要となりません。

 

 

JDBC 接続の場合は?

JDBC 接続の DB へのクロールについては別途 S3 へのアクション許可は不要です。

 

 

 

KMS キーへの権限

 

■data-lake-test-crawler-role-kms-policy


   “Version”: “2012-10-17”, 
    “Statement”: [ 
        { 
          “Effect”: “Allow”, 
          “Action”: [ 
              “kms:Decrypt” 
          ], 
          “Resource”: [ 
              “arn:aws:kms:ap-northeast-1:11111111:key/xxxxxxxxxxxxxxxxxxxxxxx” 
          ] 
        } 
    ] 
}

 

KMS で暗号化された S3 のデータソースにアクセスをするので、Glue Crawler に、KMS キーで暗号化したデータを復号するための権限を付与します。

以下の AWS 公式サイトに記載があります。

 

ステップ 2: AWS Glue 用の IAM ロールを作成する

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/create-an-iam-role.html

 

SSE-KMS で暗号化された Amazon S3 のソースとターゲットにアクセスする予定がある場合は、AWS Glue のクローラ、ジョブ、開発エンドポイントに、データを復号化するためのポリシーをアタッチしてください。詳細については、「Protecting Data Using Server-Side Encryption with AWS KMS-Managed Keys (SSE-KMS)」を参照してください。 
 
次に例を示します。 
{   
   "Version":"2012-10-17", 
   "Statement":[   
      {   
         "Effect":"Allow", 
         "Action":[   
            "kms:Decrypt" 
         ], 
         "Resource":[   
            "arn:aws:kms:*:account-id-without-hyphens:key/key-id" 
         ] 
      } 
   ] 
}

 

 

 

以上が Glue Crawler の IAM 権限周りの設計と設定となります。

 

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください