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

公開日時:2022年12月17日 / 最終更新日時:2022年12月24日

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

以前、以下の記事を作成したので参考に指定ください。

 

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

 

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

 

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

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

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

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

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

 

■Glue Interactive Session

 

■Glue DataBrew

■参考サイト

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 全体の構成図

最初に AWS Glue の全体の構成図です。

実際にデータソースからデータを抽出しターゲットに出力するのがジョブの役割です。

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

 

 

Glue Job の処理の流れ

Glue Job の処理の流れです。

ジョブは AWS 管理画面から実行することも出来ますが、下図のようにトリガーにてジョブの実行タイミングを設定することも出来ます。

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

 

 

 

ジョブはデータカタログのメタデータを元にデータソースからデータを抽出します。

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

 

 

 

ジョブはサーバーレスエンジンにて実行されます。

ETL 処理を実行しターゲットに出力します。

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

 

 

 

Glue Job とは

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

 

 

 

 

Glue Job の構成図と設計

以下が構成図です。

Glue Job(data-lake-test-job)に IAM ロール(data-lake-test-job-role)を割り当てます。

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

 

 

設計

以下のように設計します。

 

 

 

 

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

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

 

 

■信頼ポリシー


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

 

 

 

 

■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/*"  
            ]  
        }  
    ]  
}

 

 

 

 

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


   "Version": "2012-10-17", 
    "Statement": [ 
        { 
          "Effect": "Allow", 
          "Action": [ 
              "s3:GetObject", 
              "s3:PutObject", 
              "s3:List*" 
          ], 
          "Resource": [ 
              "arn:aws:s3:::data-lake-snapshot-rds-test-s3/*", 
              "arn:aws:s3::data-lake-test-target-s3/*" 
          ] 
        } 
    ] 
}

 

ジョブはデータソースとターゲット両方の S3 バケットにアクセスします。

 

 

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


   "Version": "2012-10-17", 
    "Statement": [ 
        { 
          "Effect": "Allow", 
          "Action": [ 
              "kms:Decrypt" 
          ], 
          "Resource": [ 
              "arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" 
          ] 
        } 
    ] 
}

 

もし RDS のスナップショットが KMS キーで暗号化されている場合は、複合する為に "kms:Decrypt" の権限が必要になります。

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

AlphaOmega Captcha Medica  –  What Do You See?
     
 

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

Secured By miniOrange