概要
AWS 上かつ顧客管理 VPC 上で稼働する Databricks の構築方法です。
詳細に解説されている記事が豊富にありますが (参考 URL 参照)、AWS ポータルの触り方を結構忘れていたので、Your VPC, custom
で実装する手順を残しておきます。
手順
Cloudformation テンプレート
Cloudformation で構築します。
以下記事を参考にさせてもらいました。
YAML でテンプレートを書き、ローカル環境などに保存します。
今回は、
- VPC=
/22
- Subnet=
/25
- Region=
ap-northeast-1a
で設定しています。
リソース名称や設定を細かく設定したい方は適宜変更しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
databricks-in-customer-managed-vpc-cloudformation-template.yaml AWSTemplateFormatVersion: "2010-09-09" Description: Template for Databricks in Customer-managed VPC for ap-northeast-1 Resources: VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/22 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: Databricks-VPC IGW: Type: AWS::EC2::InternetGateway Properties: Tags: - Key: Name Value: Databricks-IGW AttachIGW: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: !Ref VPC InternetGatewayId: !Ref IGW PrivateSubnetA: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1a VpcId: !Ref VPC CidrBlock: 10.0.0.0/25 Tags: - Key: Name Value: Databricks-Private-Subnet-a PrivateSubnetC: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1c VpcId: !Ref VPC CidrBlock: 10.0.1.0/25 Tags: - Key: Name Value: Databricks-Private-Subnet-c PublicSubnetA: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1a VpcId: !Ref VPC CidrBlock: 10.0.2.0/25 Tags: - Key: Name Value: Databricks-Public-Subnet-a PublicSubnetC: Type: AWS::EC2::Subnet Properties: AvailabilityZone: ap-northeast-1c VpcId: !Ref VPC CidrBlock: 10.0.3.0/25 Tags: - Key: Name Value: Databricks-Public-Subnet-c EIPA: Type: AWS::EC2::EIP Properties: Domain: vpc NATGWA: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt EIPA.AllocationId ConnectivityType: public SubnetId: !Ref PublicSubnetA Tags: - Key: Name Value: Databricks-NATGW-a EIPC: Type: AWS::EC2::EIP Properties: Domain: vpc NATGWC: Type: AWS::EC2::NatGateway Properties: AllocationId: !GetAtt EIPC.AllocationId ConnectivityType: public SubnetId: !Ref PublicSubnetC Tags: - Key: Name Value: Databricks-NATGW-c PublicRouteTable: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Databricks-Public-RouteTable PrivateRouteTableA: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Databricks-Private-RouteTable-a PrivateRouteTableC: Type: AWS::EC2::RouteTable Properties: VpcId: !Ref VPC Tags: - Key: Name Value: Databricks-Private-RouteTable-c PublicDefaultRoute: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PublicRouteTable DestinationCidrBlock: 0.0.0.0/0 GatewayId: !Ref IGW PrivateDefaultRouteA: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTableA DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref NATGWA PrivateDefaultRouteC: Type: AWS::EC2::Route Properties: RouteTableId: !Ref PrivateRouteTableC DestinationCidrBlock: 0.0.0.0/0 NatGatewayId: !Ref NATGWC PublicRouteTableAssocA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetA RouteTableId: !Ref PublicRouteTable PublicRouteTableAssocC: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PublicSubnetC RouteTableId: !Ref PublicRouteTable PrivateRouteTableAssocA: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnetA RouteTableId: !Ref PrivateRouteTableA PrivateRouteTableAssocC: Type: AWS::EC2::SubnetRouteTableAssociation Properties: SubnetId: !Ref PrivateSubnetC RouteTableId: !Ref PrivateRouteTableC SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupName: DataBricks-SecurityGroup GroupDescription: "Databricks SecurityGroup" VpcId: !Ref VPC Tags: - Key: Name Value: Databricks-SecurityGroup Outputs: VPCID: Value: !Ref VPC Export: Name: DataBricksVPCID PrivateSubnetIDA: Value: !Ref PrivateSubnetA Export: Name: DataBricksPrivateSubnetIDA PrivateSubnetIDC: Value: !Ref PrivateSubnetC Export: Name: DataBricksPrivateSubnetIDC SecurityGroupID: Value: !Ref SecurityGroup Export: Name: DatabricksSecurityGroupID |
スタックの作成
先ほど保存した YAML をつかって Cloudformation でスタックを作成します。
Databricks を稼働させる VPC 構成はこのような形に。
テンプレートは S3 に保存し、スタックの作成 (クラウドに↑アイコン)をクリック。
ステップ3のオプション設定は行わず、ステップ4レビューへと進み、スタックの作成をクリックすると、リソースの構築が始まります。
デプロイが完了したら VPC コンソールに移動し、以下パラメータを控えておきます。
Network Configrations 作成
Databricks の Admin コンソールに移り、network configration を設定します。別のWSとこれを共有することはないので、一意に識別しやすい名称を付けておきましょう
Network Configration 名称例
databricks-in-customer-managed-vpc-nw-config-01
先ほど拾ったパラメータも入力、Add をクリック
Credential configuration 作成
先ほどと同様に WS をデプロイするための権限も設定していきます。config の名称を入れ、External ID は控えておきます。まだ Add は押しません。
Network Configration 名称例
databricks-in-customer-managed-vpc-credential-config-01
アプリケーションからのアクセスを許可する必要があるので、このロールを利用できる Databricks の AWS アカウントID (414351767826
) を指定、External ID を入力。ロール名をいれてロールの作成をクリック。
Credential configuration 名称例
databricks-in-customer-managed-vpc-credential-01
作成したロールを選択し、インラインポリシーを記述。
書き換える必要のある変数は4つです。
変数 | 概要 |
---|---|
ACCOUNTID | 顧客の AWS アカウント ID |
VPCID | Cloudformation で作成した VPC の ID |
REGION | Databricks WS をデプロイするリージョン |
SECURITYGROUPID | Cloudformation で作成した SG の ID |
インラインポリシーのひな形はこちら。
databricks-ws-inline-policy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
inline_polisy { "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" } } } ] } |
Databricks コンソールの Role ARN にペースト、Add をクリック
これで Credential Configuration の設定は完了
Storage configuration 作成
最後にストレージの設定をします。Databricks の DBFS がここに収まる形です。
ストレージ名称とバケット名を入力、Generate Bucket Policy をクリックし、出力された JSON をコピーしたら、Add をクリック。
databricks-in-customer-managed-vpc-storage-01
AWS S3 コンソールへ移り、先ほど指定したバケット名で S3 を構築
構築したバケットのアクセス許可からバケットポリシーの編集と進み、
先ほどコピーした JSON をペースト、変更の保存をクリックして完了です。
WS デプロイ
最後のステップです。
Workspace から Create Workspace と進み、
ワークスペースの名称、URL を入力、ここまでで作成した Configration 3つを選択、Save をクリック
作成した WS を選択すると明細を確認できます。URL をクリックすると、
Databricks のルートアカウントでアクセスできます。
備考:デプロイがうまくいかない場合に確認すること
Credential Configuration の設定が以下で正しいかチェック
Service Control Policy でクロスアカウントアクセスを Deny しているかどうかチェック
もし Deny されているようなら Databricks がクロスアカウントの役割を引き受けられるようにホワイトリストでの登録が必要
参考 URL
トラブルシュートが必要な時は Databricks 弥生さんの記事群が参考になります。