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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/35bc188f-4600-b53b-c9a7-a993bff516d5.png)


信頼されたエンティティの種類を選択→AWSサービス
ユースケースの選択→EC2
を選択して、次のステップに進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/9dc64d48-040b-d368-2621-cea1de11a6a6.png)

アクセス権限、タグの設定は特に設定不要なのでそのまま進んでOKです。
最後の確認ページでロール名を記入してロールの作成をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/681726b1-b73e-f0e1-d4e8-22673cec985f.png)

作成したロールに戻ってインラインポリシーの追加をクリック。
ポリシーの作成ページでJSONのタブを選択し、以下スクリプトをコピぺ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/20c994b1-9dd2-388c-f527-0beb204b79e0.png)


s3-bucket-name のところは今回使用するターゲットS3バケット名を記入してください。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
     "Resource": [
        "arn:aws:s3:::s3-bucket-name"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:PutObjectAcl"
      ],
      "Resource": [
         "arn:aws:s3:::s3-bucket-name/*"
      ]
    }
  ]
}
```

ポリシーの確認に進んでポリシー名を記入し、ポリシーの作成をクリックでOK
作成したロールにもどって、ロールARNをコピーしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/25688c88-bdba-89ed-6bda-bec131a857b7.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バケット名を記入します。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Example permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-access"
      },
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::s3-bucket-name"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-access"
      },
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::s3-bucket-name/*"
    }
  ]
}
```

こんな感じでコピペできたら保存をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/27c1f809-2b67-7b61-9fe5-a4d50123eb3f.png)


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

###3.databricks on AWSデプロイ時のIAMロールの確認
https://accounts.cloud.databricks.com/registration.html#login
からdatabricksにログインします。
サイドバーからAWS Accountを選択しデプロイに使用したロールARNを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/c356ff45-62db-1840-1201-5af1f304b33d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/6528ee39-2269-5d17-bb12-dca93bed0808.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593135/314082eb-e229-56be-2ed6-b3690b7d4f2d.png)



```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1403287045000",
      "Effect": "Allow",
      "Action": [
        "ec2:AssociateDhcpOptions",
        "ec2:AssociateIamInstanceProfile",
        "ec2:AssociateRouteTable",
        "ec2:AttachInternetGateway",
        "ec2:AttachVolume",
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:CancelSpotInstanceRequests",
        "ec2:CreateDhcpOptions",
        "ec2:CreateInternetGateway",
        "ec2:CreateKeyPair",
        "ec2:CreatePlacementGroup",
        "ec2:CreateRoute",
        "ec2:CreateSecurityGroup",
        "ec2:CreateSubnet",
        "ec2:CreateTags",
        "ec2:CreateVolume",
        "ec2:CreateVpc",
        "ec2:CreateVpcPeeringConnection",
        "ec2:DeleteInternetGateway",
        "ec2:DeleteKeyPair",
        "ec2:DeletePlacementGroup",
        "ec2:DeleteRoute",
        "ec2:DeleteRouteTable",
        "ec2:DeleteSecurityGroup",
        "ec2:DeleteSubnet",
        "ec2:DeleteTags",
        "ec2:DeleteVolume",
        "ec2:DeleteVpc",
        "ec2:DescribeAvailabilityZones",
        "ec2:DescribeIamInstanceProfileAssociations",
        "ec2:DescribeInstanceStatus",
        "ec2:DescribeInstances",
        "ec2:DescribePlacementGroups",
        "ec2:DescribePrefixLists",
        "ec2:DescribeReservedInstancesOfferings",
        "ec2:DescribeRouteTables",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSpotInstanceRequests",
        "ec2:DescribeSpotPriceHistory",
        "ec2:DescribeSubnets",
        "ec2:DescribeVolumes",
        "ec2:DescribeVpcs",
        "ec2:DetachInternetGateway",
        "ec2:DisassociateIamInstanceProfile",
        "ec2:ModifyVpcAttribute",
        "ec2:ReplaceIamInstanceProfileAssociation",
        "ec2:RequestSpotInstances",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupIngress",
        "ec2:RunInstances",
        "ec2:TerminateInstances"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::aws-account-id-databricks:role/iam-role-for-s3-access"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:CreateServiceLinkedRole",
        "iam:PutRolePolicy"
      ],
      "Resource": "arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot",
      "Condition": {
        "StringLike": {
          "iam:AWSServiceName": "spot.amazonaws.com"
        }
      }
    }
  ]
}
```

編集を終えたらポリシーの確認、変更の保存でOKです。
#おわりに
databricks公式ドキュメントやってみた~Secure access to S3 buckets using instance profiles(前編)~
は以上です。
前半でAWS側の設定は完了となりましたので、後半ではそれを使ってdatabricks側の設定作業を行なっていきます。
お読みいただきありがとうございました。
引き続き後半もご覧いただけると幸いです。