databricks公式ドキュメントやってみた~Secure access to S3 buckets using instance profiles(前編)~

はじめに

公式ドキュメントやってみたシリーズ第2弾です。

今回のテーマは

「Secure access to S3 buckets using instance profiles」です。

インスタンスプロファイルを使用してセキュアにS3バケットにアクセスする方法をdatabricks公式ドキュメントの手順に従ってやってみたいと思います。

今回の作業内容

今回行う作業は以下の8項目です。

※0.ターゲットS3バケットの作成

1. S3バケットにアクセスするためのインスタンスプロファイルを作成

2. ターゲットのS3バケットのバケットポリシーの作成

3. databricks on AWSデプロイ時のIAMロールの確認

4. ターゲットS3バケットにアクセスするためのIAMロールをEC2に付与

5. インスタンスプロファイルをdatabricksにアタッチ

6. インスタンスプロファイルを使用してクラスタを立ち上げる

7. ノートブックから今回設定したS3へのアクセスを確認する

作業自体がやや長いのと、

細かいロールやポリシーの設定があるため

  • 前編(0~4)→AWS側の設定
  • 後編(5~7)→databricks側の設定

に分けてやっていきたいと思います。

本題

では、本題に入っていきましょう。

0.ターゲットS3バケットの作成

今回の内容では、databricks on AWSのデプロイ時に使用したS3バケットとは別のS3バケットが必要となりますので、お持ちでない方は新たに作成しましょう。

既存のバケットを使用するという方は次に進みます。

1.S3バケットにアクセスするためのインスタンスプロファイルを作成

AWSにログインしてコンソール画面に入ります。

IAMのページに移動します。

サイドバーからロールを選択してロールの作成をクリック。

image.png
信頼されたエンティティの種類を選択→AWSサービスユースケースの選択→EC2

を選択して、次のステップに進みます。

image.png

アクセス権限、タグの設定は特に設定不要なのでそのまま進んでOKです。

最後の確認ページでロール名を記入してロールの作成をクリック。

image.png
作成したロールに戻ってインラインポリシーの追加をクリック。ポリシーの作成ページでJSONのタブを選択し、以下スクリプトをコピぺ。

作成したロールに戻ってインラインポリシーの追加をクリック。

ポリシーの作成ページでJSONのタブを選択し、以下スクリプトをコピぺ。

image.png
s3-bucket-name のところは今回使用するターゲットS3バケット名を記入してください。
1{2  "Version": "2012-10-17",3  "Statement": [4    {5      "Effect": "Allow",6      "Action": [7        "s3:ListBucket"8      ],9     "Resource": [10        "arn:aws:s3:::s3-bucket-name"11      ]12    },13    {14      "Effect": "Allow",15      "Action": [16        "s3:PutObject",17        "s3:GetObject",18        "s3:DeleteObject",19        "s3:PutObjectAcl"20      ],21      "Resource": [22         "arn:aws:s3:::s3-bucket-name/*"23      ]24    }25  ]26}

ポリシーの確認に進んでポリシー名を記入し、ポリシーの作成をクリックでOK

ポリシーの確認に進んでポリシー名を記入し、ポリシーの作成をクリックでOK

作成したロールにもどって、ロールARNをコピーしておきましょう。

image.png

2.ターゲットのS3バケットのバケットポリシーの作成

AWSコンソール画面にもどってS3設定画面に移動します。

ターゲットS3バケット、アクセス権限、バケットポリシーの順で移動します。

バケットポリシーエディター欄で以下スクリプトをコピペします。

arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-accessの部分は1.でコピーしたロールARNを貼り付けます。

s3-bucket-nameは今回使用するターゲットS3バケット名を記入します。

1{2  "Version": "2012-10-17",3  "Statement": [4    {5      "Sid": "Example permissions",6      "Effect": "Allow",7      "Principal": {8        "AWS": "arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-access"9      },10      "Action": [11        "s3:GetBucketLocation",12        "s3:ListBucket"13      ],14      "Resource": "arn:aws:s3:::s3-bucket-name"15    },16    {17      "Effect": "Allow",18      "Principal": {19        "AWS": "arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-access"20      },21      "Action": [22        "s3:PutObject",23        "s3:GetObject",24        "s3:DeleteObject",25        "s3:PutObjectAcl"26      ],27      "Resource": "arn:aws:s3:::s3-bucket-name/*"28    }29  ]30}

こんな感じでコピペできたら保存をクリックします。

image.png

S3バケットポリシーの設定は以上です。

3.databricks on AWSデプロイ時のIAMロールの確認

https://accounts.cloud.databricks.com/registration.html#login

からdatabricksにログインします。

サイドバーからAWS Accountを選択しデプロイに使用したロールARNを確認します。

image.png

4.ターゲットS3バケットにアクセスするためのIAMロールをEC2に付与

AWSの、ロール設定画面に戻ります。

3.で確認したdatabricks on AWS デプロイ時に使用したロールを選択します。

ポリシーの編集で以下スクリプトをコピペします。

arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-accessには1.で作成したIAMロールのARNを記入します。

image.png
image.png
1{2  "Version": "2012-10-17",3  "Statement": [4    {5      "Sid": "Stmt1403287045000",6      "Effect": "Allow",7      "Action": [8        "ec2:AssociateDhcpOptions",9        "ec2:AssociateIamInstanceProfile",10        "ec2:AssociateRouteTable",11        "ec2:AttachInternetGateway",12        "ec2:AttachVolume",13        "ec2:AuthorizeSecurityGroupEgress",14        "ec2:AuthorizeSecurityGroupIngress",15        "ec2:CancelSpotInstanceRequests",16        "ec2:CreateDhcpOptions",17        "ec2:CreateInternetGateway",18        "ec2:CreateKeyPair",19        "ec2:CreatePlacementGroup",20        "ec2:CreateRoute",21        "ec2:CreateSecurityGroup",22        "ec2:CreateSubnet",23        "ec2:CreateTags",24        "ec2:CreateVolume",25        "ec2:CreateVpc",26        "ec2:CreateVpcPeeringConnection",27        "ec2:DeleteInternetGateway",28        "ec2:DeleteKeyPair",29        "ec2:DeletePlacementGroup",30        "ec2:DeleteRoute",31        "ec2:DeleteRouteTable",32        "ec2:DeleteSecurityGroup",33        "ec2:DeleteSubnet",34        "ec2:DeleteTags",35        "ec2:DeleteVolume",36        "ec2:DeleteVpc",37        "ec2:DescribeAvailabilityZones",38        "ec2:DescribeIamInstanceProfileAssociations",39        "ec2:DescribeInstanceStatus",40        "ec2:DescribeInstances",41        "ec2:DescribePlacementGroups",42        "ec2:DescribePrefixLists",43        "ec2:DescribeReservedInstancesOfferings",44        "ec2:DescribeRouteTables",45        "ec2:DescribeSecurityGroups",46        "ec2:DescribeSpotInstanceRequests",47        "ec2:DescribeSpotPriceHistory",48        "ec2:DescribeSubnets",49        "ec2:DescribeVolumes",50        "ec2:DescribeVpcs",51        "ec2:DetachInternetGateway",52        "ec2:DisassociateIamInstanceProfile",53        "ec2:ModifyVpcAttribute",54        "ec2:ReplaceIamInstanceProfileAssociation",55        "ec2:RequestSpotInstances",56        "ec2:RevokeSecurityGroupEgress",57        "ec2:RevokeSecurityGroupIngress",58        "ec2:RunInstances",59        "ec2:TerminateInstances"60      ],61      "Resource": [62        "*"63      ]64    },65    {66      "Effect": "Allow",67      "Action": "iam:PassRole",68      "Resource": "arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-access"69    },70    {71      "Effect": "Allow",72      "Action": [73        "iam:CreateServiceLinkedRole",74        "iam:PutRolePolicy"75      ],76      "Resource": "arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot",77      "Condition": {78        "StringLike": {79          "iam:AWSServiceName": "spot.amazonaws.com"80        }81      }82    }83  ]84}

編集を終えたらポリシーの確認、変更の保存でOKです。

おわりに

databricks公式ドキュメントやってみた~Secure access to S3 buckets using instance profiles(前編)~

は以上です。

前半でAWS側の設定は完了となりましたので、後半ではそれを使ってdatabricks側の設定作業を行なっていきます。

お読みいただきありがとうございました。

引き続き後半もご覧いただけると幸いです。

この記事を書いた人

aws-recipe-user