AWS Glue 実践入門 環境準備編(1):IAM権限周りの設定について

eyecatch_glue

AWS Glueのサービスを本格活用するには、事前に幾つかの準備作業が必要となります。当エントリではそのうちの「IAM権限周り」に関する設定内容を1つずつ進めながら実際にどのような構成となっているかを見ていきたいと思います。

目次

 

Step1. AWS Glueサービスで用いるIAMポリシーを作成

AWS GlueがAWSリソース上のデータにアクセス出来るようにするためにはアクセス権限が必要となります。AWS IAMを使用してアクセスに必要なポリシーを作成します。

ドキュメントの手順では事前作成済であるAWSGlueServiceRoleと同じようなポリシーを作成する、とありますがこちらの中身自体はどのようなものになっているか、現時点の内容を確認してみたいと思います。aws iam get-policyコマンドで対象のポリシーの内容を確認。現在のバージョンIDはv3となっている事が確認出来ます。

$ aws iam get-policy --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole
{
    "Policy": {
        "PolicyName": "AWSGlueServiceRole", 
        "Description": "Policy for AWS Glue service role which allows access to related services including EC2, S3, and Cloudwatch Logs", 
        "CreateDate": "2017-08-14T13:37:21Z", 
        "AttachmentCount": 1, 
        "IsAttachable": true, 
        "PolicyId": "ANPAIRUJCPEBPMEZFAS32", 
        "DefaultVersionId": "v3", 
        "Path": "/service-role/", 
        "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole", 
        "UpdateDate": "2017-08-23T21:35:25Z"
    }
}

aws iam get-policy-versionコマンドでバージョン毎の内容を確認する事が出来ます。計3つのバージョンを追う毎にどのような更新が為されてきたのか確認してみたいと思います。まずはバージョン毎の内容をテキストに書き出し。

$ aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole --version-id v1 > policy-AWSGlueServiceRole-v1.txt
$ aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole --version-id v2 > policy-AWSGlueServiceRole-v2.txt
$ aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole --version-id v3 > policy-AWSGlueServiceRole-v3.txt

次いでバージョン毎の内容をdiffコマンドで比較してみたいと思います。v1からv2ではs3:DeleteObjectが追加されている事が確認出来ました。

$ diff policy-AWSGlueServiceRole-v1.txt policy-AWSGlueServiceRole-v2.txt 
3,4c3,4
<         "CreateDate": "2017-08-14T13:37:21Z", 
<         "VersionId": "v1", 
---
>         "CreateDate": "2017-08-17T18:08:13Z", 
>         "VersionId": "v2", 
43c43,44
<                         "s3:PutObject"
---
>                         "s3:PutObject", 
>                         "s3:DeleteObject"

v2からv3への変更も数点行われているようです。

$ diff policy-AWSGlueServiceRole-v2.txt policy-AWSGlueServiceRole-v3.txt 
3,4c3,4
<         "CreateDate": "2017-08-17T18:08:13Z", 
<         "VersionId": "v2", 
---
>         "CreateDate": "2017-08-23T21:35:25Z", 
>         "VersionId": "v3", 
17a18
>                         "ec2:DeleteNetworkInterface", 
76,77c77
<                         "ec2:DeleteTags", 
<                         "ec2:DeleteNetworkInterface"
---
>                         "ec2:DeleteTags"
95c95
<         "IsDefaultVersion": false
---
>         "IsDefaultVersion": true

ドキュメントの手順では所定の内容を用いたカスタムポリシーを作成していましたが、内容を確認してみたところ事前定義済の管理ポリシーの内容も追従しているようでしたのでここでは管理ポリシーとなるAWSGlueServiceRoleをそのまま活用する方向で進めて行きたいと思います。

 

Step2. AWS Glueサービスで用いるIAM Roleを作成

次に、AWS Glueで各種処理を行う際に用いるIAM Roleの作成を行います。ここで必要となるのは以下の権限です。IAM RoleにはAWS Glueで使用する全てのソース/ターゲット/スクリプト、及びAWS Glueで用いる一時ディレクトリに対するAmazon S3へのアクセスを含みます。

管理コンソールにてAWS IAMサービス画面に遷移、[Roles]メニューから[Create Role]を押下。

aws-glue-getting-started-step2_01

ロールのタイプを選択します。「AWS Service」を選択した後、

aws-glue-getting-started-step2_02

「Glue」を選択。選択済ユースケースの一覧にGlueが入っている事を確認後、[Next: Permissions]を押下。

aws-glue-getting-started-step2_03

作成するロールに割り当てる権限を選択します。ここではAWSGlueServiceRoleAmazonS3FullAccessをそれぞれ選択、[Next:Preview]を押下。

aws-glue-getting-started-step2_04
aws-glue-getting-started-step2_05

ロール名と説明の入力を行います。コンソールユーザーがサービスにロールを渡すために、文字列:AWSGlueServiceRoleの接頭辞が付けられたロールを作成します。これはAWS Glueが提供するポリシーでは「IAM RoleがAWSGlueServiceRoleで始まる」という前提で設定されている事によります。

この命名規約以外の名称でロールを作成した場合、(命名規約に沿うように)ユーザーがiam:PassRole権限をIAM Roleに対して許可出来るようにポリシーを追加する必要があるようです。敢えて命名規約を変更するのもアレなので、ここはドキュメントに従いAWSGlueServiceRoleDefaultCMという名前で作成してみる事にしました。

aws-glue-getting-started-step2_06

IAM Role作成完了。

aws-glue-getting-started-step2_07

 

Step3. AWS GlueにサインインするIAMユーザーに対してポリシーを添付

AWS GlueコンソールまたはAWS CLIにサインインするIAMユーザーは特定リソースにアクセスするために所定の権限を有している必要があります。AWS IAMポリシー設定を通じてこの権限付与を行います。

IAMユーザーが必要とするポリシーは以下の通りです。公式ドキュメントではAWS Glueのカスタムポリシーを作成する例も載せていますが、ここでは作成済管理ポリシーであるAWSGlueConsoleFullAccessを使う方法で進めたいと思います。

  • 事前作成済の管理ポリシー:AWSGlueConsoleFullAccess もしくはカスタムポリシー:GlueConsoleAccessPolicy
  • CloudWatchLogsReadOnlyAccess (CloudWatch Logsに対する読み取り権限)
  • AWSCloudFormationReadOnlyAccess (AWS CloudFormationに対する読み取り権限)
  • AmazonAthenaFullAccess (Amazon Athenaに対するフルアクセス権限)

今回の検証用にIAMユーザーを作成してみる事にします。cm-shinyaa31-for-glueというIAMユーザーを新規作成しました。このユーザーに対して必要となるIAMポリシーを付与していきます。

aws-glue-getting-started-step3_01

作成したユーザーに対して必要とされるポリシーを追加していきます。

aws-glue-getting-started-step3_02

必要なポリシーが割り当てられている事を確認し、ポリシーをアタッチ。

aws-glue-getting-started-step3_03

IAMユーザーへのポリシー設定が完了しました。

aws-glue-getting-started-step3_04

 

Step4. ノートブックサーバ用のIAMポリシーを作成

次の手順は「ノートブック用のIAMポリシーを作成」するというものです。初出の単語ですがこれはどういった意味なのでしょうか。Pythonやその他の言語のコードを含んだWebドキュメントを作成出来る機能を持った「Jupyter Notebook」に関する下記解説エントリに分かり易い説明文がありましたので引用します。

Notebookはブラウザで動作するプログラムの対話型実行環境です。 ノートブックと呼ばれるドキュメントを作成し、プログラムの記述と実行、メモの作成、保存と共有などをブラウザ上で行うことができます。

開発エンドポイントでこの「ノートブック」を使用する場合、サーバの作成時にパーミッションを付与する必要があります。この時に用いるポリシーを作成する、というのがこのステップの内容となります。

手順では任意のカスタムポリシーを自作するという内容が展開されていますが、こちらも既に作成済の管理ポリシーとしてAWSGlueServiceNotebookRoleというポリシーが用意されていますのでこれを使う事にしたいと思います。

念のため、この管理ポリシーはどのような内容になっているかを確認してみます。エントリ投稿時点での最新バージョンはv2となっていますので、

$ aws iam get-policy --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceNotebookRole
{
    "Policy": {
        "PolicyName": "AWSGlueServiceNotebookRole", 
        "Description": "Policy for AWS Glue service role which allows customer to manage notebook server", 
        "CreateDate": "2017-08-14T13:37:42Z", 
        "AttachmentCount": 0, 
        "IsAttachable": true, 
        "PolicyId": "ANPAXXXXXXXXXXXXXXXXX", 
        "DefaultVersionId": "v2", 
        "Path": "/service-role/", 
        "Arn": "arn:aws:iam::aws:policy/service-role/AWSGlueServiceNotebookRole", 
        "UpdateDate": "2017-08-17T18:08:29Z"
    }
}

バージョン指定での内容確認も行ってみます。Glueに関する詳細な権限設定が行われている事が確認出来ますね。バケットのプレフィックス指定については前述のポリシーと同じ形を取っているようです。

$ aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/service-role/AWSGlueServiceNotebookRole --version-id v2
{
    "PolicyVersion": {
        "CreateDate": "2017-08-17T18:08:29Z", 
        "VersionId": "v2", 
        "Document": {
            "Version": "2012-10-17", 
            "Statement": [
                {
                    "Action": [
                        "glue:CreateDatabase", 
                        "glue:CreatePartition", 
                        "glue:CreateTable", 
                        "glue:DeleteDatabase", 
                        "glue:DeletePartition", 
                        "glue:DeleteTable", 
                        "glue:GetDatabase", 
                        "glue:GetDatabases", 
                        "glue:GetPartition", 
                        "glue:GetPartitions", 
                        "glue:GetTable", 
                        "glue:GetTableVersions", 
                        "glue:GetTables", 
                        "glue:UpdateDatabase", 
                        "glue:UpdatePartition", 
                        "glue:UpdateTable", 
                        "glue:CreateBookmark", 
                        "glue:GetBookmark", 
                        "glue:UpdateBookmark", 
                        "glue:GetMetric", 
                        "glue:PutMetric", 
                        "glue:CreateConnection", 
                        "glue:CreateJob", 
                        "glue:DeleteConnection", 
                        "glue:DeleteJob", 
                        "glue:GetConnection", 
                        "glue:GetConnections", 
                        "glue:GetDevEndpoint", 
                        "glue:GetDevEndpoints", 
                        "glue:GetJob", 
                        "glue:GetJobs", 
                        "glue:UpdateJob", 
                        "glue:BatchDeleteConnection", 
                        "glue:UpdateConnection", 
                        "glue:GetUserDefinedFunction", 
                        "glue:UpdateUserDefinedFunction", 
                        "glue:GetUserDefinedFunctions", 
                        "glue:DeleteUserDefinedFunction", 
                        "glue:CreateUserDefinedFunction", 
                        "glue:BatchGetPartition", 
                        "glue:BatchDeletePartition", 
                        "glue:BatchCreatePartition", 
                        "glue:BatchDeleteTable", 
                        "glue:UpdateDevEndpoint", 
                        "s3:GetBucketLocation", 
                        "s3:ListBucket", 
                        "s3:ListAllMyBuckets", 
                        "s3:GetBucketAcl"
                    ], 
                    "Resource": [
                        "*"
                    ], 
                    "Effect": "Allow"
                }, 
                {
                    "Action": [
                        "s3:GetObject"
                    ], 
                    "Resource": [
                        "arn:aws:s3:::crawler-public*", 
                        "arn:aws:s3:::aws-glue*"
                    ], 
                    "Effect": "Allow"
                }, 
                {
                    "Action": [
                        "s3:PutObject", 
                        "s3:DeleteObject"
                    ], 
                    "Resource": [
                        "arn:aws:s3:::aws-glue*"
                    ], 
                    "Effect": "Allow"
                }, 
                {
                    "Action": [
                        "ec2:CreateTags", 
                        "ec2:DeleteTags"
                    ], 
                    "Resource": [
                        "arn:aws:ec2:*:*:network-interface/*", 
                        "arn:aws:ec2:*:*:security-group/*", 
                        "arn:aws:ec2:*:*:instance/*"
                    ], 
                    "Effect": "Allow", 
                    "Condition": {
                        "ForAllValues:StringEquals": {
                            "aws:TagKeys": [
                                "aws-glue-service-resource"
                            ]
                        }
                    }
                }
            ]
        }, 
        "IsDefaultVersion": true
    }
}

 

Step5. ノートブックサーバ用のIAM Roleを作成

ノートブックサーバが所定のリソースへのアクセスを行えるようにするために、前述手順(Step4)で作成したポリシーを使ったIAM Roleを作成します。

管理コンソールIAMメニューより[Role]→[Create Role]を選択。

aws-glue-getting-started-step5_01

ロールタイプの選択で[AWS Service]→[EC2]を選択、[Next:Permissions]を選択。

aws-glue-getting-started-step5_02

ロールに割り当てるポリシーを選択。ここではAWSGlueServiceNotebookRoleAmazonS3FullAccessの2つのポリシーを指定します。

aws-glue-getting-started-step5_03

ロール名及び説明の入力。こちらのロール名についてもStep2同様、任意の接頭辞で始まる名前とする事でコンソールユーザーからノートブックサーバーにロールを渡す事が出来ます。AWSGlueServiceNotebookRoleという文字列で始まっていれば条件に合致しますのでここではAWSGlueServiceNotebookRoleDefaultCMという名前でロールを作ってみる事にしました。

aws-glue-getting-started-step5_04

こちらのロールも無事作成出来ました。

aws-glue-getting-started-step5_05

 

ここまでの手順で出来上がった要素

Step1〜Step5で作成した要素について情報整理した内容が以下となります。それぞれ「AWS Glueサービス」「IAMユーザー」「Notebookサーバ用EC2」に対して、必要なIAMポリシーを組み合わせて権限付与した形です。

AWS Glue-IAM Permission Setting

 

まとめ

という訳でAWS Glueの実践入門第1弾としてIAM周りの環境設定を進めてみました。事前に作成する要素としてはそこそこボリュームがある感じでしたが実際試してみるとなるほど、という感じで綺麗に整理出来ました。AWS Glueそのものの機能を活用するにはまだ他にも環境設定が必要となります。第2弾エントリでその辺りについても見ていきたいと思います。

AWS Cloud Roadshow 2017 福岡