Databricks on AWS にデプロイ手順 (in 顧客管理VPC)

概要

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 でスタックを作成します。

スタックの作成をクリック

image.png
YAML をアップロード、デザイナーで表示。

YAML をアップロード、デザイナーで表示。

image.png
Databricks を稼働させる VPC 構成はこのような形に。テンプレートは S3 に保存し、スタックの作成 (クラウドに↑アイコン)をクリック。
image.png

Databricks を稼働させる VPC 構成はこのような形に。

テンプレートは S3 に保存し、スタックの作成 (クラウドに↑アイコン)をクリック。

image.png
ステップ2へと進み、スタックの名称を指定。

ステップ2へと進み、スタックの名称を指定。

image.png

ステップ3のオプション設定は行わず、ステップ4レビューへと進み、スタックの作成をクリックすると、リソースの構築が始まります。

image.png

デプロイが完了したら VPC コンソールに移動し、以下パラメータを控えておきます。

image.png

Network Configrations 作成

Databricks の Admin コンソールに移り、network configration を設定します。別のWSとこれを共有することはないので、一意に識別しやすい名称を付けておきましょう

Network Configration 名称例

databricks-in-customer-managed-vpc-nw-config-01

先ほど拾ったパラメータも入力、Add をクリック

image.png
以下で完了

以下で完了

image.png

Credential configuration 作成

先ほどと同様に WS をデプロイするための権限も設定していきます。config の名称を入れ、External ID は控えておきます。まだ Add は押しません。

Network Configration 名称例

databricks-in-customer-managed-vpc-credential-config-01

image.png
AWS IAM コンソールに移り、ロールを作成をクリック

AWS IAM コンソールに移り、ロールを作成をクリック

image.png

アプリケーションからのアクセスを許可する必要があるので、このロールを利用できる Databricks の AWS アカウントID (414351767826) を指定、External ID を入力。ロール名をいれてロールの作成をクリック。

Credential configuration 名称例

databricks-in-customer-managed-vpc-credential-01

image.png
作成したロールを選択し、インラインポリシーを記述。

作成したロールを選択し、インラインポリシーを記述。

image.png

書き換える必要のある変数は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 をコピーし、

image.png

Databricks コンソールの Role ARN にペースト、Add をクリック

image.png
これで Credential Configuration の設定は完了

これで Credential Configuration の設定は完了

image.png

Storage configuration 作成

最後にストレージの設定をします。Databricks の DBFS がここに収まる形です。

ストレージ名称とバケット名を入力、Generate Bucket Policy をクリックし、出力された JSON をコピーしたら、Add をクリック。

databricks-in-customer-managed-vpc-storage-01
image.png

AWS S3 コンソールへ移り、先ほど指定したバケット名で S3 を構築

image.png

バケットのバージョニングは有効化推奨です。

image.png
構築したバケットのアクセス許可からバケットポリシーの編集と進み、

構築したバケットのアクセス許可からバケットポリシーの編集と進み、

image.png

先ほどコピーした JSON をペースト、変更の保存をクリックして完了です。

image.png

WS デプロイ

最後のステップです。

Workspace から Create Workspace と進み、

image.png
ワークスペースの名称、URL を入力、ここまでで作成した Configration 3つを選択、Save をクリック

ワークスペースの名称、URL を入力、ここまでで作成した Configration 3つを選択、Save をクリック

image.png
ステータスが running になれば完成

ステータスが running になれば完成

2021-11-12_13h18_23.png
作成した WS を選択すると明細を確認できます。URL をクリックすると、

作成した WS を選択すると明細を確認できます。URL をクリックすると、

image.png

Databricks のルートアカウントでアクセスできます。

image.png

備考:デプロイがうまくいかない場合に確認すること

Credential Configuration の設定が以下で正しいかチェック

image.png

Service Control Policy でクロスアカウントアクセスを Deny しているかどうかチェック

もし Deny されているようなら Databricks がクロスアカウントの役割を引き受けられるようにホワイトリストでの登録が必要

image.png

参考 URL

トラブルシュートが必要な時は Databricks 弥生さんの記事群が参考になります。

Databricksクイックスタートガイド – Qiita

Databricks on AWSにおけるアカウントのセットアップとワークスペースのデプロイメント(実践編) – Qiita

Databricksにおける顧客管理VPC – Qiita
Databricksにおける顧客管理VPC(実践編) – Qiita
Databricksワークスペース(E2)作成時のトラブルシューティング – Qiita

この記事を書いた人

aws-recipe-user