概要
AWS 上かつ顧客管理 VPC 上で稼働する Databricks の構築方法です。
詳細に解説されている記事が豊富にありますが (参考 URL 参照)、AWS ポータルの触り方を結構忘れていたので、Your VPC, custom で実装する手順を残しておきます。
手順
Cloudformation テンプレート
Cloudformation で構築します。
以下記事を参考にさせてもらいました。
DatabricksでCustemer Managed VPCにClusterをプロビジョニングする | DevelopersIO
YAML でテンプレートを書き、ローカル環境などに保存します。
今回は、
- VPC=/22
- Subnet=/25
- Region=ap-northeast-1a
で設定しています。
リソース名称や設定を細かく設定したい方は適宜変更しましょう。
1databricks-in-customer-managed-vpc-cloudformation-template.yaml2AWSTemplateFormatVersion: "2010-09-09"3Description: Template for Databricks in Customer-managed VPC for ap-northeast-145Resources:6 VPC:7 Type: AWS::EC2::VPC8 Properties:9 CidrBlock: 10.0.0.0/2210 EnableDnsSupport: true11 EnableDnsHostnames: true12 Tags:13 - Key: Name14 Value: Databricks-VPC1516 IGW:17 Type: AWS::EC2::InternetGateway18 Properties:19 Tags:20 - Key: Name21 Value: Databricks-IGW2223 AttachIGW:24 Type: AWS::EC2::VPCGatewayAttachment25 Properties:26 VpcId: !Ref VPC27 InternetGatewayId: !Ref IGW28 29 PrivateSubnetA:30 Type: AWS::EC2::Subnet31 Properties:32 AvailabilityZone: ap-northeast-1a33 VpcId: !Ref VPC34 CidrBlock: 10.0.0.0/2535 Tags:36 - Key: Name37 Value: Databricks-Private-Subnet-a3839 PrivateSubnetC:40 Type: AWS::EC2::Subnet41 Properties:42 AvailabilityZone: ap-northeast-1c43 VpcId: !Ref VPC44 CidrBlock: 10.0.1.0/2545 Tags:46 - Key: Name47 Value: Databricks-Private-Subnet-c4849 PublicSubnetA:50 Type: AWS::EC2::Subnet51 Properties:52 AvailabilityZone: ap-northeast-1a53 VpcId: !Ref VPC54 CidrBlock: 10.0.2.0/2555 Tags:56 - Key: Name57 Value: Databricks-Public-Subnet-a5859 PublicSubnetC:60 Type: AWS::EC2::Subnet61 Properties:62 AvailabilityZone: ap-northeast-1c63 VpcId: !Ref VPC64 CidrBlock: 10.0.3.0/2565 Tags:66 - Key: Name67 Value: Databricks-Public-Subnet-c6869 EIPA:70 Type: AWS::EC2::EIP71 Properties:72 Domain: vpc7374 NATGWA:75 Type: AWS::EC2::NatGateway76 Properties:77 AllocationId: !GetAtt EIPA.AllocationId78 ConnectivityType: public79 SubnetId: !Ref PublicSubnetA80 Tags:81 - Key: Name82 Value: Databricks-NATGW-a8384 EIPC:85 Type: AWS::EC2::EIP86 Properties:87 Domain: vpc8889 NATGWC:90 Type: AWS::EC2::NatGateway91 Properties:92 AllocationId: !GetAtt EIPC.AllocationId93 ConnectivityType: public94 SubnetId: !Ref PublicSubnetC95 Tags:96 - Key: Name97 Value: Databricks-NATGW-c9899 PublicRouteTable:100 Type: AWS::EC2::RouteTable101 Properties:102 VpcId: !Ref VPC103 Tags:104 - Key: Name105 Value: Databricks-Public-RouteTable106107 PrivateRouteTableA:108 Type: AWS::EC2::RouteTable109 Properties:110 VpcId: !Ref VPC111 Tags:112 - Key: Name113 Value: Databricks-Private-RouteTable-a114 115 PrivateRouteTableC:116 Type: AWS::EC2::RouteTable117 Properties:118 VpcId: !Ref VPC119 Tags:120 - Key: Name121 Value: Databricks-Private-RouteTable-c122123 PublicDefaultRoute:124 Type: AWS::EC2::Route125 Properties:126 RouteTableId: !Ref PublicRouteTable127 DestinationCidrBlock: 0.0.0.0/0128 GatewayId: !Ref IGW129 130 PrivateDefaultRouteA:131 Type: AWS::EC2::Route132 Properties:133 RouteTableId: !Ref PrivateRouteTableA134 DestinationCidrBlock: 0.0.0.0/0135 NatGatewayId: !Ref NATGWA136 137 PrivateDefaultRouteC:138 Type: AWS::EC2::Route139 Properties:140 RouteTableId: !Ref PrivateRouteTableC141 DestinationCidrBlock: 0.0.0.0/0142 NatGatewayId: !Ref NATGWC143144 PublicRouteTableAssocA:145 Type: AWS::EC2::SubnetRouteTableAssociation146 Properties:147 SubnetId: !Ref PublicSubnetA148 RouteTableId: !Ref PublicRouteTable149 150 PublicRouteTableAssocC:151 Type: AWS::EC2::SubnetRouteTableAssociation152 Properties:153 SubnetId: !Ref PublicSubnetC154 RouteTableId: !Ref PublicRouteTable155 156 PrivateRouteTableAssocA:157 Type: AWS::EC2::SubnetRouteTableAssociation158 Properties:159 SubnetId: !Ref PrivateSubnetA160 RouteTableId: !Ref PrivateRouteTableA161 162 PrivateRouteTableAssocC:163 Type: AWS::EC2::SubnetRouteTableAssociation164 Properties:165 SubnetId: !Ref PrivateSubnetC166 RouteTableId: !Ref PrivateRouteTableC167168 SecurityGroup:169 Type: AWS::EC2::SecurityGroup170 Properties:171 GroupName: DataBricks-SecurityGroup172 GroupDescription: "Databricks SecurityGroup"173 VpcId: !Ref VPC174 Tags:175 - Key: Name176 Value: Databricks-SecurityGroup177178Outputs:179 VPCID:180 Value: !Ref VPC181 Export: 182 Name: DataBricksVPCID183184 PrivateSubnetIDA:185 Value: !Ref PrivateSubnetA186 Export: 187 Name: DataBricksPrivateSubnetIDA188189 PrivateSubnetIDC:190 Value: !Ref PrivateSubnetC191 Export: 192 Name: DataBricksPrivateSubnetIDC193194 SecurityGroupID:195 Value: !Ref SecurityGroup196 Export: 197 Name: DatabricksSecurityGroupIDスタックの作成
先ほど保存した YAML をつかって Cloudformation でスタックを作成します。
スタックの作成をクリック
YAML をアップロード、デザイナーで表示。
Databricks を稼働させる VPC 構成はこのような形に。
テンプレートは S3 に保存し、スタックの作成 (クラウドに↑アイコン)をクリック。
ステップ2へと進み、スタックの名称を指定。
ステップ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
AWS IAM コンソールに移り、ロールを作成をクリック
アプリケーションからのアクセスを許可する必要があるので、このロールを利用できる 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
1inline_polisy2{3 "Version": "2012-10-17",4 "Statement": [5 {6 "Sid": "NonResourceBasedPermissions",7 "Effect": "Allow",8 "Action": [9 "ec2:CancelSpotInstanceRequests",10 "ec2:DescribeAvailabilityZones",11 "ec2:DescribeIamInstanceProfileAssociations",12 "ec2:DescribeInstanceStatus",13 "ec2:DescribeInstances",14 "ec2:DescribeInternetGateways",15 "ec2:DescribeNatGateways",16 "ec2:DescribeNetworkAcls",17 "ec2:DescribePrefixLists",18 "ec2:DescribeReservedInstancesOfferings",19 "ec2:DescribeRouteTables",20 "ec2:DescribeSecurityGroups",21 "ec2:DescribeSpotInstanceRequests",22 "ec2:DescribeSpotPriceHistory",23 "ec2:DescribeSubnets",24 "ec2:DescribeVolumes",25 "ec2:DescribeVpcAttribute",26 "ec2:DescribeVpcs",27 "ec2:CreateTags",28 "ec2:DeleteTags",29 "ec2:RequestSpotInstances"30 ],31 "Resource": [32 "*"33 ]34 },35 {36 "Sid": "InstancePoolsSupport",37 "Effect": "Allow",38 "Action": [39 "ec2:AssociateIamInstanceProfile",40 "ec2:DisassociateIamInstanceProfile",41 "ec2:ReplaceIamInstanceProfileAssociation"42 ],43 "Resource": "arn:aws:ec2:REGION:ACCOUNTID:instance/*",44 "Condition": {45 "StringEquals": {46 "ec2:ResourceTag/Vendor": "Databricks"47 }48 }49 },50 {51 "Sid": "AllowEc2RunInstancePerTag",52 "Effect": "Allow",53 "Action": "ec2:RunInstances",54 "Resource": [55 "arn:aws:ec2:REGION:ACCOUNTID:volume/*",56 "arn:aws:ec2:REGION:ACCOUNTID:instance/*"57 ],58 "Condition": {59 "StringEquals": {60 "aws:RequestTag/Vendor": "Databricks"61 }62 }63 },64 {65 "Sid": "AllowEc2RunInstanceImagePerTag",66 "Effect": "Allow",67 "Action": "ec2:RunInstances",68 "Resource": [69 "arn:aws:ec2:REGION:ACCOUNTID:image/*"70 ],71 "Condition": {72 "StringEquals": {73 "aws:ResourceTag/Vendor": "Databricks"74 }75 }76 },77 {78 "Sid": "AllowEc2RunInstancePerVPCid",79 "Effect": "Allow",80 "Action": "ec2:RunInstances",81 "Resource": [82 "arn:aws:ec2:REGION:ACCOUNTID:network-interface/*",83 "arn:aws:ec2:REGION:ACCOUNTID:subnet/*",84 "arn:aws:ec2:REGION:ACCOUNTID:security-group/*"85 ],86 "Condition": {87 "StringEquals": {88 "ec2:vpc": "arn:aws:ec2:REGION:ACCOUNTID:vpc/VPCID"89 }90 }91 },92 {93 "Sid": "AllowEc2RunInstanceOtherResources",94 "Effect": "Allow",95 "Action": "ec2:RunInstances",96 "NotResource": [97 "arn:aws:ec2:REGION:ACCOUNTID:image/*",98 "arn:aws:ec2:REGION:ACCOUNTID:network-interface/*",99 "arn:aws:ec2:REGION:ACCOUNTID:subnet/*",100 "arn:aws:ec2:REGION:ACCOUNTID:security-group/*",101 "arn:aws:ec2:REGION:ACCOUNTID:volume/*",102 "arn:aws:ec2:REGION:ACCOUNTID:instance/*"103 ]104 },105 {106 "Sid": "EC2TerminateInstancesTag",107 "Effect": "Allow",108 "Action": [109 "ec2:TerminateInstances"110 ],111 "Resource": [112 "arn:aws:ec2:REGION:ACCOUNTID:instance/*"113 ],114 "Condition": {115 "StringEquals": {116 "ec2:ResourceTag/Vendor": "Databricks"117 }118 }119 },120 {121 "Sid": "EC2AttachDetachVolumeTag",122 "Effect": "Allow",123 "Action": [124 "ec2:AttachVolume",125 "ec2:DetachVolume"126 ],127 "Resource": [128 "arn:aws:ec2:REGION:ACCOUNTID:instance/*",129 "arn:aws:ec2:REGION:ACCOUNTID:volume/*"130 ],131 "Condition": {132 "StringEquals": {133 "ec2:ResourceTag/Vendor": "Databricks"134 }135 }136 },137 {138 "Sid": "EC2CreateVolumeByTag",139 "Effect": "Allow",140 "Action": [141 "ec2:CreateVolume"142 ],143 "Resource": [144 "arn:aws:ec2:REGION:ACCOUNTID:volume/*"145 ],146 "Condition": {147 "StringEquals": {148 "aws:RequestTag/Vendor": "Databricks"149 }150 }151 },152 {153 "Sid": "EC2DeleteVolumeByTag",154 "Effect": "Allow",155 "Action": [156 "ec2:DeleteVolume"157 ],158 "Resource": [159 "arn:aws:ec2:REGION:ACCOUNTID:volume/*"160 ],161 "Condition": {162 "StringEquals": {163 "ec2:ResourceTag/Vendor": "Databricks"164 }165 }166 },167 {168 "Effect": "Allow",169 "Action": [170 "iam:CreateServiceLinkedRole",171 "iam:PutRolePolicy"172 ],173 "Resource": "arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot",174 "Condition": {175 "StringLike": {176 "iam:AWSServiceName": "spot.amazonaws.com"177 }178 }179 },180 {181 "Sid": "VpcNonresourceSpecificActions",182 "Effect": "Allow",183 "Action": [184 "ec2:AuthorizeSecurityGroupEgress",185 "ec2:AuthorizeSecurityGroupIngress",186 "ec2:RevokeSecurityGroupEgress",187 "ec2:RevokeSecurityGroupIngress"188 ],189 "Resource": "arn:aws:ec2:REGION:ACCOUNTID:security-group/SECURITYGROUPID",190 "Condition": {191 "StringEquals": {192 "ec2:vpc": "arn:aws:ec2:REGION:ACCOUNTID:vpc/VPCID"193 }194 }195 }196 ]197 }ポリシーの記述まで終わったら ロール ARN をコピーし、
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 をクリック
ステータスが running になれば完成
作成した WS を選択すると明細を確認できます。URL をクリックすると、
Databricks のルートアカウントでアクセスできます。
備考:デプロイがうまくいかない場合に確認すること
Credential Configuration の設定が以下で正しいかチェック
Service Control Policy でクロスアカウントアクセスを Deny しているかどうかチェック
もし Deny されているようなら Databricks がクロスアカウントの役割を引き受けられるようにホワイトリストでの登録が必要
参考 URL
トラブルシュートが必要な時は Databricks 弥生さんの記事群が参考になります。
Databricksクイックスタートガイド – Qiita
Databricks on AWSにおけるアカウントのセットアップとワークスペースのデプロイメント(実践編) – Qiita