DatabricksにおけるクロスアカウントIAMロールの作成

[Create a cross\-account IAM role \| Databricks on AWS](https://docs.databricks.com/administration-guide/account-api/iam-role.html) [2022/10/13時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksがお使いのAWSアカウントにワークスペースをデプロイできる様に、どのようにクロスアカウントIAMロールをセットアップするのかを学びましょう。

:::note
**ティップ**
[Databricks Terraformプロバイダー](https://qiita.com/taka_yayoi/items/691ee4909b0961de5ad1)を用いてIAMロール作成を自動化することができます。[Terraformを用いたDatabricksワークスペース\(E2\)の配備](https://qiita.com/taka_yayoi/items/11d4ef49871e9b1292bb)をご覧ください。
:::

# クロスアカウントロールの作成

1. お使いのDatabricks**外部ID**(アカウントID)を取得します。お使いのAWSアカウントでAWSのクロスアカウントIAMロールを作成する際に必要となります。

   [アカウントコンソール](https://docs.databricks.com/administration-guide/account-settings-e2/index.html#account-console)に移動し、右上のユーザー名の隣の下向き矢印をクリックします。**Account ID**でIDをコピーします。

    また、**Cloud resources > Credential configuration > Add credential configuration**に移動することで(**External ID**というラベルで)このIDを取得することができます。

1. 管理者権限を持つユーザーとしてAWSコンソールにログインし、**IAM**に移動します。
1. サイドバーで**Roles**タブをクリックします。
1. **Create role**をクリックします。
    1. **Select type of trusted entity**で**AWS account**タイルをクリックします。
    1. **Another AWS account**チェックボックスを選択します。
    1. Account IDフィールドで、DatabricksのアカウントID`414351767826`を入力します。

        これは、DatabricksのアカウントコンソールからコピーしたアカウントID**ではありません**。
![](https://docs.databricks.com/_images/trusted-entity.png)

    1. **Require external ID**チェックボックスを選択します。
    1. **External ID**フィールドに、Databricksアカウントコンソールからコピーした、あなたのDatabricksアカウントIDを入力します。
    1. **Next: Add Permissions**ボタンをクリックします。
    1. **Next: Name, Review, and Create**ボタンをクリックします。
    1. **Role name**フィールドにロール名を入力します。
        **Step 1: Select trusted entities**のJSONは以下の様なものとなります。

        ```json:JSON
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "sts:AssumeRole",
              "Principal": {
                "AWS": "414351767826"
              },
              "Condition": {
                "StringEquals": {
                  "sts:ExternalId": "YOUR_EXTERNAL_ID"
                }
              }
            }
          ]
        }
        ```

    1. **Create role**をクリックします。ロール一覧が表示されます。

# アクセスポリシーの作成

新規ワークスペースを作成するには、お使いのクロスアカウントIAMロールにアクセスポリシーをセットアップしなくてはなりません。このポリシーは使用するAmazon VPC(Virtual Private Cloud)のデプロイメントのタイプと、ご自身で適用する制限によって変化します。3つのポリシーオプションがあります:

- **デフォルト:** DatabricksがあなたのAWSアカウント作成し、設定する単一のVPCにワークスペースを作成します。これはデフォルトの設定です。デフォルトのポリシーを使用するには、[デフォルトのデプロイメントポリシー](#デフォルトのデプロイメントポリシー)をご覧ください。
- **デフォルトの制限を用いた顧客管理VPC:** [顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)という機能を用いて、ご自身のVPCの中にDatabricksワークスペースを作成します。このポリシーを使用するには、[デフォルトのポリシー制限を用いた顧客管理VPC](#デフォルトのポリシー制限を用いた顧客管理vpc)をご覧ください。
- **カスタムの制限を用いた顧客管理VPC:** [顧客管理VPC](https://qiita.com/taka_yayoi/items/f23bd799e1960e2eccbe)という機能を用いて、ご自身のVPCの中にDatabricksワークスペースを作成します。アカウントID、VPC ID、AWSリージョン、セキュリティグループに対するカスタムの制限を用いて、アクセスポリシーを設定することができます。このポリシーを使用するには、[カスタムのポリシー制限を用いた顧客管理VPC](#カスタムのポリシー制限を用いた顧客管理vpc)をご覧ください。

:::note warn
**重要！**
これらのポリシーでは、ワークスペースでNo Public IP (NPIP)とも呼ばれるセキュアクラスター接続を使用していることを前提としています。2022/9/1以降にAccount APIを用いて作成されたワークスペースでは、セキュアクラスター接続はデフォルトとなっています。お使いのワークスペースでセキュアクラスター接続(NPIP)を使用していない場合には、Databricks担当者にお問い合わせください。
:::

## デフォルトのデプロイメントポリシー

以下のステップには、お使いのAWSアカウントにDatabricksが作成、設定するVPCでDatabricksワークスペースを起動するためのアクセスポリシーが含まれています。Databricksがそれぞれの権限をどの様に使用するのかに関しては、[IAM permissions for Databricks\-managed VPC](https://docs.databricks.com/administration-guide/cloud-configurations/aws/permissions.html#databricks-managed-vpc)をご覧ください。

1. ロール一覧で、作成したロールをクリックします。
1. インラインポリシーを追加します。
    1. **Permissions**タブで、**Add inline policy**をクリックします。
![](https://docs.databricks.com/_images/inline-policy.png)
    1. ポリシーエディタで**JSON**タブをクリックします。
![](https://docs.databricks.com/_images/policy-editor.png)
    1. あなたのAWSアカウントにDatabricksが作成、設定するVPCにワークスペースをデプロイするためのアクセスポリシーをコピーします。

        ```json:JSON
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "Stmt1403287045000",
              "Effect": "Allow",
              "Action": [
                "ec2:AllocateAddress",
                "ec2:AssociateDhcpOptions",
                "ec2:AssociateIamInstanceProfile",
                "ec2:AssociateRouteTable",
                "ec2:AttachInternetGateway",
                "ec2:AttachVolume",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CancelSpotInstanceRequests",
                "ec2:CreateDhcpOptions",
                "ec2:CreateInternetGateway",
                "ec2:CreateNatGateway",
                "ec2:CreateRoute",
                "ec2:CreateRouteTable",
                "ec2:CreateSecurityGroup",
                "ec2:CreateSubnet",
                "ec2:CreateTags",
                "ec2:CreateVolume",
                "ec2:CreateVpc",
                "ec2:CreateVpcEndpoint",
                "ec2:DeleteDhcpOptions",
                "ec2:DeleteInternetGateway",
                "ec2:DeleteNatGateway",
                "ec2:DeleteRoute",
                "ec2:DeleteRouteTable",
                "ec2:DeleteSecurityGroup",
                "ec2:DeleteSubnet",
                "ec2:DeleteTags",
                "ec2:DeleteVolume",
                "ec2:DeleteVpc",
                "ec2:DeleteVpcEndpoints",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeIamInstanceProfileAssociations",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeNatGateways",
                "ec2:DescribePrefixLists",
                "ec2:DescribeReservedInstancesOfferings",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSpotInstanceRequests",
                "ec2:DescribeSpotPriceHistory",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DescribeVpcs",
                "ec2:DetachInternetGateway",
                "ec2:DisassociateIamInstanceProfile",
                "ec2:DisassociateRouteTable",
                "ec2:ModifyVpcAttribute",
                "ec2:ReleaseAddress",
                "ec2:ReplaceIamInstanceProfileAssociation",
                "ec2:RequestSpotInstances",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RunInstances",
                "ec2:TerminateInstances"
              ],
              "Resource": [
                "*"
              ]
            },
            {
              "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"
                }
              }
            }
          ]
        }
        ```

    1. **Review policy**をクリックします。
    1. **Name**フィールドにポリシー名を入力します。
    1. **Create policy**をクリックします。
    1. AWSアカウントレベルで特定のアクションを拒否する[Service Control Policies](https://aws.amazon.com/blogs/security/how-to-use-service-control-policies-to-set-permission-guardrails-across-accounts-in-your-aws-organization/)を使用している場合には、Databricksがクロスアカウントロールを仮定(assume)できるように`sts:AssumeRole`が許可リストに入っていることを確認してください。

1. ロールのサマリーで、**Role ARN**をコピーします。
![](https://docs.databricks.com/_images/role-arn.png)

## デフォルトのポリシー制限を用いた顧客管理VPC

以下のステップには、デフォルトのポリシー制限を用いて顧客管理VPC内にDatabricksワークスペースを起動するためのアクセスポリシーが含まれています。Databricksがそれぞれの権限をどの様に使用するのかに関しては、[IAM permissions for Databricks\-managed VPC](https://docs.databricks.com/administration-guide/cloud-configurations/aws/permissions.html#databricks-managed-vpc)をご覧ください。

1. 管理者権限を持つユーザーとしてAWSコンソールにログインし、**IAM**コンソールに移動します。
1. サイドバーの**Roles**に移動します。
1. ロール一覧で、Databricks用に作成したクロスアカウントIAMロールをクリックします。
1. インラインポリシーを追加します。
    1. **Permissions**タブで、**Add inline policy**をクリックします。
![](https://docs.databricks.com/_images/inline-policy.png)
    1. ポリシーエディタで**JSON**タブをクリックします。
![](https://docs.databricks.com/_images/policy-editor.png)
    1. **デフォルトのポリシー制限を用いた顧客管理VPC**にワークスペースをデプロイするためのアクセスポリシーをコピーします。

        ```json:JSON
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "Stmt1403287045000",
              "Effect": "Allow",
              "Action": [
                "ec2:AssociateIamInstanceProfile",
                "ec2:AttachVolume",
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:CancelSpotInstanceRequests",
                "ec2:CreateTags",
                "ec2:CreateVolume",
                "ec2:DeleteTags",
                "ec2:DeleteVolume",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeIamInstanceProfileAssociations",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeNatGateways",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribePrefixLists",
                "ec2:DescribeReservedInstancesOfferings",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSpotInstanceRequests",
                "ec2:DescribeSpotPriceHistory",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DescribeVpcAttribute",
                "ec2:DescribeVpcs",
                "ec2:DetachVolume",
                "ec2:DisassociateIamInstanceProfile",
                "ec2:ReplaceIamInstanceProfileAssociation",
                "ec2:RequestSpotInstances",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupIngress",
                "ec2:RunInstances",
                "ec2:TerminateInstances"
              ],
              "Resource": [
                "*"
              ]
            },
            {
              "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"
                }
              }
            }
          ]
        }
        ```

    1. **Review policy**をクリックします。
    1. **Name**フィールドにポリシー名を入力します。
    1. **Create policy**をクリックします。
    1. AWSアカウントレベルで特定のアクションを拒否する[Service Control Policies](https://aws.amazon.com/blogs/security/how-to-use-service-control-policies-to-set-permission-guardrails-across-accounts-in-your-aws-organization/)を使用している場合には、Databricksがクロスアカウントロールを仮定(assume)できるように`sts:AssumeRole`が許可リストに入っていることを確認してください。

1. ロールのサマリーで、**Role ARN**をコピーします。
![](https://docs.databricks.com/_images/role-arn.png)

## カスタムのポリシー制限を用いた顧客管理VPC

以下のステップには、カスタムのポリシー制限を用いて顧客管理VPC内にDatabricksワークスペースを起動するためのアクセスポリシーが含まれています。Databricksがそれぞれの権限をどの様に使用するのかに関しては、[IAM permissions for Databricks\-managed VPC](https://docs.databricks.com/administration-guide/cloud-configurations/aws/permissions.html#databricks-managed-vpc)をご覧ください。

:::note
**注意**
Amazon Machine Images (AMI)から提供されているDatabricksのプロダクションAWSアカウントは`601306020600`です。お使いのAWSアカウントでどのAMIを使用できるのかを制限するカスタムアクセスポリシーを作成するために、このアカウントIDを使用することができます。詳細については、Databricks担当者にお問い合わせください。
:::

1. 管理者権限を持つユーザーとしてAWSコンソールにログインし、**IAM**コンソールに移動します。
1. サイドバーの**Roles**に移動します。
1. ロール一覧で、Databricks用に作成したクロスアカウントIAMロールをクリックします。
1. インラインポリシーを追加します。
    1. **Permissions**タブで、**Add inline policy**をクリックします。
![](https://docs.databricks.com/_images/inline-policy.png)
    1. ポリシーエディタで**JSON**タブをクリックします。
![](https://docs.databricks.com/_images/policy-editor.png)
    1. **アカウントID、VPC ID、リージョン、セキュリティグループに対するカスタムポリシーを用いた顧客管理VPC**にワークスペースをデプロイするには、以下のアクセスポリシーをコピーします。

        ポリシーの以下の値をご自身の設定値で置き換えてください。

        - `ACCOUNTID` - お使いのAWSアカウントID、数値です。
        - `VPCID` - ワークスペースを起動したいAWS VPCのID。
        - `REGION` - `us-west-2`のようなVPCデプロイメントのAWSリージョン名。
        - `SECURITYGROUPID` - お使いのAWSセキュリティグループのID。セキュリティグループの制限を追加する場合、クロスアカウントIAMロールやクレディンシャルID(`credentials_id`)への参照を他のワークスペースで再利用することはできません。他のワークスペースには、別のロール、ポリシー、認証オブジェクトを作成する必要があります。

        :::note
        **注意**
        お使いのセキュリティグループが不変の場合、ポリシーから権限: `ec2:AuthorizeSecurityGroupEgress`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:RevokeSecurityGroupEgress`, `ec2:RevokeSecurityGroupIngress`を削除してください。最後にある`Sid`が`VpcNonresourceSpecificActions`であるJSONオブジェクトを削除するようにポリシーを編集してください。
       :::    

        ```json:JSON
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "NonResourceBasedPermissions",
              "Effect": "Allow",
              "Action": [
                "ec2:CancelSpotInstanceRequests",
                "ec2:DescribeAvailabilityZones",
                "ec2:DescribeIamInstanceProfileAssociations",
                "ec2:DescribeInstanceStatus",
                "ec2:DescribeInstances",
                "ec2:DescribeInternetGateways",
                "ec2:DescribeNatGateways",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribePrefixLists",
                "ec2:DescribeReservedInstancesOfferings",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSpotInstanceRequests",
                "ec2:DescribeSpotPriceHistory",
                "ec2:DescribeSubnets",
                "ec2:DescribeVolumes",
                "ec2:DescribeVpcAttribute",
                "ec2:DescribeVpcs",
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:RequestSpotInstances"
              ],
              "Resource": [
                "*"
              ]
            },
            {
              "Sid": "InstancePoolsSupport",
              "Effect": "Allow",
              "Action": [
                "ec2:AssociateIamInstanceProfile",
                "ec2:DisassociateIamInstanceProfile",
                "ec2:ReplaceIamInstanceProfileAssociation"
              ],
              "Resource": "arn:aws:ec2:REGION:ACCOUNTID:instance/*",
              "Condition": {
                "StringEquals": {
                  "ec2:ResourceTag/Vendor": "Databricks"
                }
              }
            },
            {
              "Sid": "AllowEc2RunInstancePerTag",
              "Effect": "Allow",
              "Action": "ec2:RunInstances",
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:volume/*",
                "arn:aws:ec2:REGION:ACCOUNTID:instance/*"
              ],
              "Condition": {
                "StringEquals": {
                  "aws:RequestTag/Vendor": "Databricks"
                }
              }
            },
            {
              "Sid": "AllowEc2RunInstanceImagePerTag",
              "Effect": "Allow",
              "Action": "ec2:RunInstances",
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:image/*"
              ],
              "Condition": {
                "StringEquals": {
                  "aws:ResourceTag/Vendor": "Databricks"
                }
              }
            },
            {
              "Sid": "AllowEc2RunInstancePerVPCid",
              "Effect": "Allow",
              "Action": "ec2:RunInstances",
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:network-interface/*",
                "arn:aws:ec2:REGION:ACCOUNTID:subnet/*",
                "arn:aws:ec2:REGION:ACCOUNTID:security-group/*"
              ],
              "Condition": {
                "StringEquals": {
                  "ec2:vpc": "arn:aws:ec2:REGION:ACCOUNTID:vpc/VPCID"
                }
              }
            },
            {
              "Sid": "AllowEc2RunInstanceOtherResources",
              "Effect": "Allow",
              "Action": "ec2:RunInstances",
              "NotResource": [
                "arn:aws:ec2:REGION:ACCOUNTID:image/*",
                "arn:aws:ec2:REGION:ACCOUNTID:network-interface/*",
                "arn:aws:ec2:REGION:ACCOUNTID:subnet/*",
                "arn:aws:ec2:REGION:ACCOUNTID:security-group/*",
                "arn:aws:ec2:REGION:ACCOUNTID:volume/*",
                "arn:aws:ec2:REGION:ACCOUNTID:instance/*"
              ]
            },
            {
              "Sid": "EC2TerminateInstancesTag",
              "Effect": "Allow",
              "Action": [
                "ec2:TerminateInstances"
              ],
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:instance/*"
              ],
              "Condition": {
                "StringEquals": {
                  "ec2:ResourceTag/Vendor": "Databricks"
                }
              }
            },
            {
              "Sid": "EC2AttachDetachVolumeTag",
              "Effect": "Allow",
              "Action": [
                "ec2:AttachVolume",
                "ec2:DetachVolume"
              ],
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:instance/*",
                "arn:aws:ec2:REGION:ACCOUNTID:volume/*"
              ],
              "Condition": {
                "StringEquals": {
                  "ec2:ResourceTag/Vendor": "Databricks"
                }
              }
            },
            {
              "Sid": "EC2CreateVolumeByTag",
              "Effect": "Allow",
              "Action": [
                "ec2:CreateVolume"
              ],
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:volume/*"
              ],
              "Condition": {
                "StringEquals": {
                  "aws:RequestTag/Vendor": "Databricks"
                }
              }
            },
            {
              "Sid": "EC2DeleteVolumeByTag",
              "Effect": "Allow",
              "Action": [
                "ec2:DeleteVolume"
              ],
              "Resource": [
                "arn:aws:ec2:REGION:ACCOUNTID:volume/*"
              ],
              "Condition": {
                "StringEquals": {
                  "ec2:ResourceTag/Vendor": "Databricks"
                }
              }
            },
            {
              "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"
                }
              }
            },
            {
              "Sid": "VpcNonresourceSpecificActions",
              "Effect": "Allow",
              "Action": [
                "ec2:AuthorizeSecurityGroupEgress",
                "ec2:AuthorizeSecurityGroupIngress",
                "ec2:RevokeSecurityGroupEgress",
                "ec2:RevokeSecurityGroupIngress"
              ],
              "Resource": "arn:aws:ec2:REGION:ACCOUNTID:security-group/SECURITYGROUPID",
              "Condition": {
                "StringEquals": {
                  "ec2:vpc": "arn:aws:ec2:REGION:ACCOUNTID:vpc/VPCID"
                }
              }
            }
          ]
        }
        ```

    1. **Review policy**をクリックします。
    1. **Name**フィールドにポリシー名を入力します。
    1. **Create policy**をクリックします。
    1. AWSアカウントレベルで特定のアクションを拒否する[Service Control Policies](https://aws.amazon.com/blogs/security/how-to-use-service-control-policies-to-set-permission-guardrails-across-accounts-in-your-aws-organization/)を使用している場合には、Databricksがクロスアカウントロールを仮定(assume)できるように`sts:AssumeRole`が許可リストに入っていることを確認してください。

1. ロールのサマリーで、**Role ARN**をコピーします。
![](https://docs.databricks.com/_images/role-arn.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)