ワークスペースデプロイ用のIAMロールを作成する

この記事では、次の方法について説明します:

  • Databricksワークスペースデプロイ用のクロスアカウントIAMロールを作成して設定します。このロールにより、Databricksは、コンピュートリソースとVPCリソースの作成と管理を目的として、お客様のAWSアカウントへの限定的なアクセス権を付与されます。

  • Databricks アカウントコンソール を使用して、IAM ロールを参照する認証情報設定を作成します。

要件

IAMロールの作成を自動化する

以下の自動化オプションのいずれかを使用して、IAMロールの作成を自動化できます:

手動でのIAMロール作成

次の手順は、カスタムAWSワークスペースのデプロイに適用されます。カスタムAWS設定オプションを使用してワークスペースをデプロイする場合のみ、以下の手順を実行する必要があります。

ステップ1:クロスアカウントIAMロールを作成する

  1. Databricks アカウント ID を取得します。 アカウント ID を確認するを参照してください。

  2. 管理者権限を持つユーザーとしてAWSコンソールにログインし、IAMコンソールに移動します。

  3. サイドバーの[ロール]タブをクリックします。

  4. [役割の作成]をクリックします。

    1. [信頼できるエンティティの種類の選択]で、[AWSアカウント]タイルをクリックします。

    2. [別のAWSアカウント]チェックボックスを選択してください。

    3. アカウント ID フィールドに、 Databricksアカウント ID 414351767826 を入力します。 これは、 アカウント コンソールからコピーしたアカウント IDDatabricks では ありません 。Databricks on AWS GovCloudで Databricksを使用している場合は、 Databricksアカウント ID 044793339203 を使用してください。

    4. [外部IDが必要]チェックボックスを選択してください。

    5. [外部ID]フィールドに、DatabricksアカウントコンソールからコピーしたDatabricksアカウントIDを入力します。

    6. [次へ]ボタンをクリックします。

    7. [権限の追加]ページで、[次へ]ボタンをクリックします。[名前、確認、作成]ページが表示されます。

    8. [ロール名]フィールドにロール名を入力します。

    9. [役割の作成]をクリックします。役割のリストが表示されます。

ステップ2:アクセスポリシーを作成する

ロールに追加するアクセスポリシーは、Amazon VPC (仮想プライベートクラウド) のデプロイタイプによって異なります。 Databricks が各アクセス許可を使用する方法については、「 Databricks マネージド VPC の IAM アクセス許可」を参照してください。 デプロイを説明するポリシーの手順を使用します。

オプション1:デフォルトの展開ポリシー

  1. IAMコンソールの[ロール]セクションで、ステップ1で作成したIAMロールをクリックします。

  2. [権限を追加]ドロップダウンをクリックし、[インラインポリシーの作成]を選択します。

  3. ポリシーエディターで、[JSON]タブをクリックします。

  4. 以下のアクセスポリシーをコピー&ペーストしてください:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "Stmt1403287045000",
          "Effect": "Allow",
          "Action": [
            "ec2:AllocateAddress",
            "ec2:AssignPrivateIpAddresses",
            "ec2:AssociateDhcpOptions",
            "ec2:AssociateIamInstanceProfile",
            "ec2:AssociateRouteTable",
            "ec2:AttachInternetGateway",
            "ec2:AttachVolume",
            "ec2:AuthorizeSecurityGroupEgress",
            "ec2:AuthorizeSecurityGroupIngress",
            "ec2:CancelSpotInstanceRequests",
            "ec2:CreateDhcpOptions",
            "ec2:CreateFleet",
            "ec2:CreateInternetGateway",
            "ec2:CreateLaunchTemplate",
            "ec2:CreateLaunchTemplateVersion",
            "ec2:CreateNatGateway",
            "ec2:CreateRoute",
            "ec2:CreateRouteTable",
            "ec2:CreateSecurityGroup",
            "ec2:CreateSubnet",
            "ec2:CreateTags",
            "ec2:CreateVolume",
            "ec2:CreateVpc",
            "ec2:CreateVpcEndpoint",
            "ec2:DeleteDhcpOptions",
            "ec2:DeleteFleets",
            "ec2:DeleteInternetGateway",
            "ec2:DeleteLaunchTemplate",
            "ec2:DeleteLaunchTemplateVersions",
            "ec2:DeleteNatGateway",
            "ec2:DeleteRoute",
            "ec2:DeleteRouteTable",
            "ec2:DeleteSecurityGroup",
            "ec2:DeleteSubnet",
            "ec2:DeleteTags",
            "ec2:DeleteVolume",
            "ec2:DeleteVpc",
            "ec2:DeleteVpcEndpoints",
            "ec2:DescribeAvailabilityZones",
            "ec2:DescribeFleetHistory",
            "ec2:DescribeFleetInstances",
            "ec2:DescribeFleets",
            "ec2:DescribeIamInstanceProfileAssociations",
            "ec2:DescribeInstanceStatus",
            "ec2:DescribeInstances",
            "ec2:DescribeInternetGateways",
            "ec2:DescribeLaunchTemplates",
            "ec2:DescribeLaunchTemplateVersions",
            "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:GetLaunchTemplateData",
            "ec2:GetSpotPlacementScores",
            "ec2:ModifyFleet",
            "ec2:ModifyLaunchTemplate",
            "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"
            }
          }
        }
      ]
    }
    
  5. [ポリシーの確認]をクリックします。

  6. [名前]フィールドにポリシー名を入力します。

  7. [ポリシーの作成]をクリックします。

  8. (オプション)AWSアカウントレベルで特定のアクションを拒否するためにService Control Policiesを使用する場合、Databricksがクロスアカウントの役割を引き受けることができるようにsts:AssumeRoleがallowlistedであることを確認します。

  9. ロールの概要で、ロールARNをコピーしてDatabricksに追加します。

オプション2:デフォルトの制限ポリシーを使用した顧客管理VPC

  1. 管理者権限を持つユーザーとしてAWSコンソールにログインし、IAMコンソールに移動します。

  2. サイドバーの[ロール]タブをクリックします。

  3. ロールのリストで、ステップ1で作成したクロスアカウントIAMロールをクリックします。

  4. [権限を追加]ドロップダウンをクリックし、[インラインポリシーの作成]を選択します。

  5. ポリシーエディターで、[JSON]タブをクリックします。

  6. 次のアクセスポリシーをコピーして貼り付けます。

    {
      "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",
            "ec2:DescribeFleetHistory",
            "ec2:ModifyFleet",
            "ec2:DeleteFleets",
            "ec2:DescribeFleetInstances",
            "ec2:DescribeFleets",
            "ec2:CreateFleet",
            "ec2:DeleteLaunchTemplate",
            "ec2:GetLaunchTemplateData",
            "ec2:CreateLaunchTemplate",
            "ec2:DescribeLaunchTemplates",
            "ec2:DescribeLaunchTemplateVersions",
            "ec2:ModifyLaunchTemplate",
            "ec2:DeleteLaunchTemplateVersions",
            "ec2:CreateLaunchTemplateVersion",
            "ec2:AssignPrivateIpAddresses",
            "ec2:GetSpotPlacementScores"
          ],
          "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"
            }
          }
        }
      ]
    }
    
  7. [ポリシーの確認]をクリックします。

  8. [名前]フィールドにポリシー名を入力します。

  9. [ポリシーの作成]をクリックします。

  10. (オプション)AWSアカウントレベルで特定のアクションを拒否するためにService Control Policiesを使用する場合、Databricksがクロスアカウントの役割を引き受けることができるようにsts:AssumeRoleがallowlistedであることを確認します。

  11. ロールの概要で、ロールARNをコピーします。

オプション3:カスタムポリシー制限付きの顧客管理VPC

Amazon Machine Images (AMI) のソースとなる Databricks 本番運用 AWS アカウントは 601306020600です。 このアカウント ID を使用して、AWS アカウント内で使用できる AMI を制限するカスタムアクセスポリシーを作成できます。 詳細については、Databricks アカウント チームにお問い合わせください。

  1. 管理者権限を持つユーザーとしてAWSコンソールにログインし、IAMコンソールに移動します。

  2. サイドバーの[ロール]タブをクリックします。

  3. ロールのリストで、ステップ1で作成した[クロスアカウントIAMロール]をクリックします。

  4. [アクセス許可の追加]ドロップダウンをクリックし、[インラインポリシーの作成]をクリックします。

  5. ポリシーエディターで、[JSON]タブをクリックします。

  6. 次のアクセスポリシーをコピーして貼り付けます。

    ポリシー内の次の値を独自の設定値に置き換えます:

    • ACCOUNTID — AWSアカウントID(数字)。

    • VPCID —ワークスペースを起動するAWS VPCのID。

    • REGION — VPCデプロイメントのAWSリージョン名(例:us-west-2)。

    • SECURITYGROUPID — AWSセキュリティグループのID。セキュリティグループ制限を追加すると、クロスアカウントIAMロールを再利用したり、他のワークスペースの認証情報ID(credentials_id)を参照したりすることはできません。他のワークスペースについては、個別のロール、ポリシー、資格情報オブジェクトを作成する必要があります。

    顧客管理 VPC でセキュリティ グループに対してカスタム要件を構成している場合は、IAM ポリシーのカスタマイズについて、Databricks アカウント チームにお問い合わせください。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "NonResourceBasedPermissions",
          "Effect": "Allow",
          "Action": [
            "ec2:AssignPrivateIpAddresses",
            "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:GetSpotPlacementScores",
            "ec2:RequestSpotInstances",
            "ec2:DescribeFleetHistory",
            "ec2:ModifyFleet",
            "ec2:DeleteFleets",
            "ec2:DescribeFleetInstances",
            "ec2:DescribeFleets",
            "ec2:CreateFleet",
            "ec2:DeleteLaunchTemplate",
            "ec2:GetLaunchTemplateData",
            "ec2:CreateLaunchTemplate",
            "ec2:DescribeLaunchTemplates",
            "ec2:DescribeLaunchTemplateVersions",
            "ec2:ModifyLaunchTemplate",
            "ec2:DeleteLaunchTemplateVersions",
            "ec2:CreateLaunchTemplateVersion"
          ],
          "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"
            }
          }
        }
      ]
    }
    
  7. [ポリシーの確認]をクリックします。

  8. [名前]フィールドにポリシー名を入力します。

  9. [ポリシーの作成]をクリックします。

  10. (オプション)AWSアカウントレベルで特定のアクションを拒否するためにService Control Policiesを使用する場合、Databricksがクロスアカウントの役割を引き受けることができるようにsts:AssumeRoleがallowlistedであることを確認します。

  11. ロールの概要で、ロールARNをコピーします。

ステップ3:Databricksで資格情報構成を作成する

IAMロールを作成したら、そのロールのIDを使用する資格情報構成を作成することで、それをDatabricksに伝えることができます。

クレデンシャルコンフィギュレーションを作成する方法:

  1. [アカウントコンソール]で、[クラウドリソース]をクリックします。

  2. [資格情報の構成]をクリックします。

  3. [資格情報構成の追加]をクリックします。

  4. [資格情報構成名]フィールドに、新しい資格情報構成の人間が判読できる名前を入力します。

  5. [ロールARN]フィールドに、ロールのARNを入力します。

  6. [追加]をクリックします。

検証は、クレデンシャル構成作成中には実行されません。一部のエラーは、構成を使用して新しいワークスペースを作成する場合にのみ検出されます。これらのエラーには、無効なARNやロールに対する不正な権限などが含まれる可能性があります。

資格情報構成を削除する

資格情報の構成は、作成後に編集することはできません。構成に不正なデータが含まれている場合、またはそのデータが不要になった場合は、資格情報構成を削除します:

  1. アカウントコンソールで、[クラウドリソース] をクリックします。

  2. [資格情報の構成]をクリックします。

  3. 認証情報の設定行で、[アクション]メニューアイコンをクリックし、[削除]を選択します。

    資格情報構成名をクリックし、ポップアップダイアログで[削除]をクリックすることもできます。

  4. 確認ダイアログで、[削除の確認]をクリックします。