はじめに
公式ドキュメントやってみたシリーズ第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のページに移動します。
サイドバーからロールを選択してロールの作成をクリック。
を選択して、次のステップに進みます。
アクセス権限、タグの設定は特に設定不要なのでそのまま進んでOKです。
最後の確認ページでロール名を記入してロールの作成をクリック。
作成したロールに戻ってインラインポリシーの追加をクリック。
ポリシーの作成ページでJSONのタブを選択し、以下スクリプトをコピぺ。
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をコピーしておきましょう。
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}こんな感じでコピペできたら保存をクリックします。
S3バケットポリシーの設定は以上です。
3.databricks on AWSデプロイ時のIAMロールの確認
https://accounts.cloud.databricks.com/registration.html#login
からdatabricksにログインします。
サイドバーからAWS Accountを選択しデプロイに使用したロールARNを確認します。
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を記入します。
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側の設定作業を行なっていきます。
お読みいただきありがとうございました。
引き続き後半もご覧いただけると幸いです。