DatabricksワークスペースをAWSにデプロイした際の手順や注意点についてご紹介します。
事前準備
Databricksアカウントを作成していない場合は、サインアップします。
AWSクイックスタートを利用する場合
アカウントコンソールに移動し、「ワークスペース」→「ワークスペースを作成」をクリックします。
開いたポップアップで「既存のクラウドアカウントを使用」を選択し、「クイックスタートで自動作成」を選択し、「続行」をクリックします。
CloudFormationのスタックのクイック作成の画面が自動的に開くため、「スタックの作成」をクリックします。
※「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」にチェックを入れておきます。
作成が完了したら、ステータスが「CREATE_COMPLETE」となります。ワークスペースの作成完了時、Databricksから通知メールが届きます。
作成が完了したらアカウントコンソールのワークスペース一覧に表示が追加され、通常通り利用できるようになります。
手動作成する場合
アカウントコンソールに移動し、「ワークスペース」→「ワークスペースを作成」をクリックします。
開いたポップアップで「既存のクラウドアカウントを使用」を選択し、「Databricksで手動作成」を選択し、「続行」をクリックします。
「次のページ」をクリックします。
ストレージ構成作成
ストレージ設定で「ストレージ構成の作成」を選択し、以下の手順でストレージの設定を行っていきます。
1. バケット作成
AWSでS3のバケットを作成します。
2. アクセス許可設定
バケットの「アクセス許可」→「バケットポリシー」の「編集」をクリックし、以下のポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Grant Databricks Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::414351767826:root"
},
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": ["arn:aws:s3:::<BUCKET-NAME>/*", "arn:aws:s3:::<BUCKET-NAME>"],
"Condition": {
"StringEquals": {
"aws:PrincipalTag/DatabricksAccountId": ["<DATABRICKS-ACCOUNT-ID>"]
}
}
},
{
"Sid": "Prevent DBFS from accessing Unity Catalog metastore",
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::414351767826:root"
},
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::<BUCKET-NAME>/unity-catalog/*"]
}
]
}
以下の値を置き換えます。
<BUCKET-NAME>
:バケット名<DATABRICKS-ACCOUNT-ID>
:DatabricksアカウントID
DatabricksアカウントIDは、アカウントコンソール画面右上のアイコンをクリックして確認可能です。
編集が完了したら、変更を保存します。
3. IAMロール作成
IAMコンソールからロールの作成を行います。
「カスタム信頼ポリシー」を選択し、以下のポリシーを設定します。(ロール作成時の仮のポリシー。後で修正する)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL"]
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "0000"
}
}
}
]
}
「次へ」をクリックし、許可は追加せずに進みます。
ロール名と説明は適当なものを入力し、「ロールを作成」をクリックします。
ロール作成後、「信頼関係」タブの「信頼ポリシーを編集」をクリックし、以下のポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL",
"arn:aws:iam::<AWS-ACCOUNT-ID>:role/<THIS-ROLE-NAME>"
]
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<DATABRICKS-ACCOUNT-ID>"
}
}
}
]
}
以下の値を置き換えます。
<AWS-ACCOUNT-ID>
:AWSアカウントID<THIS-ROLE-NAME>
:ロール名<DATABRICKS-ACCOUNT-ID>
:DatabricksアカウントID
編集が完了したら、変更を保存します。
4. バケット操作用IAMポリシー作成
先のロールにアタッチするためのIAMポリシーを作成します。
以下のポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::<BUCKET>/unity-catalog/*"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": "arn:aws:s3:::<BUCKET>"
},
{
"Action": ["kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*"],
"Resource": ["arn:aws:kms:<KMS-KEY>"],
"Effect": "Allow"
},
{
"Action": ["sts:AssumeRole"],
"Resource": ["arn:aws:iam::<AWS-ACCOUNT-ID>:role/<AWS-IAM-ROLE-NAME>"],
"Effect": "Allow"
}
]
}
以下の値を置き換えます。
<BUCKET>
:S3バケット名<KMS-KEY>
:KMSキー名<AWS-ACCOUNT-ID>
:AWSアカウントID<AWS-IAM-ROLE-NAME>
:IAMロール名
KMSはバケットの暗号化キーをKMSで管理している場合に設定します。
AWSのマネージドキーを使用しているか、暗号化が無効の場合はKMSセクション全体を削除します。
編集が完了したら次へ進み、適当なポリシー名と説明を入力して「ポリシーの作成」をクリックします。
5. ファイルイベント用IAMポリシー作成(オプション)
こちらの手順はオプションだが、実施が強く推奨されています。
以下の設定をもつポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ManagedFileEventsSetupStatement",
"Effect": "Allow",
"Action": [
"s3:GetBucketNotification",
"s3:PutBucketNotification",
"sns:ListSubscriptionsByTopic",
"sns:GetTopicAttributes",
"sns:SetTopicAttributes",
"sns:CreateTopic",
"sns:TagResource",
"sns:Publish",
"sns:Subscribe",
"sqs:CreateQueue",
"sqs:DeleteMessage",
"sqs:ReceiveMessage",
"sqs:SendMessage",
"sqs:GetQueueUrl",
"sqs:GetQueueAttributes",
"sqs:SetQueueAttributes",
"sqs:TagQueue",
"sqs:ChangeMessageVisibility",
"sqs:PurgeQueue"
],
"Resource": ["arn:aws:s3:::<BUCKET>", "arn:aws:sqs:*:*:*", "arn:aws:sns:*:*:*"]
},
{
"Sid": "ManagedFileEventsListStatement",
"Effect": "Allow",
"Action": ["sqs:ListQueues", "sqs:ListQueueTags", "sns:ListTopics"],
"Resource": "*"
},
{
"Sid": "ManagedFileEventsTeardownStatement",
"Effect": "Allow",
"Action": ["sns:Unsubscribe", "sns:DeleteTopic", "sqs:DeleteQueue"],
"Resource": ["arn:aws:sqs:*:*:*", "arn:aws:sns:*:*:*"]
}
]
}
バケットのイベント通知設定の更新、SNSトピックの作成、SQSキューの作成、およびSQSキューのSNSトピックへのサブスクライブを行う権限をDatabricksに付与します。これらは、ファイルイベントを使用する機能に必要なリソースです。
6. ポリシー適用
3で作成したロールにポリシーをアタッチします。
ストレージ構成設定
ワークスペース作成フローに戻り、以下を設定する。
- ストレージ設定名:作成するストレージ設定の名称
- バケット名:S3バケット名
- IAMロールARN:上記で作成したIAMロールのARN
設定が完了したら、「ストレージ設定の作成・続行」をクリックする。
資格情報作成
資格情報の設定で「新しい資格情報を追加」を選択します。
1. クロスアカウントIAMロール作成
IAMコンソールからロールの作成を行います。
以下の内容でロールを作成します。
- 信頼されたエンティティタイプ:AWSアカウント
- AWSアカウント:414351767826
※AWS GovCloudを使用している場合、こちらの内容を参考にAWSアカウントを指定します。
「次へ」をクリックし、許可は追加せずに進みます。
ロール名と説明は適当なものを入力し、「ロールを作成」をクリックします。
2. アクセスポリシー作成
ロールに追加するポリシーは、Amazon VPCのデプロイタイプによって異なります。
各方法についての詳細はこちらを参照ください。
今回の検証では、上記オプション2の顧客管理VPC(デフォルトの制限付き)の方法で行います。
1で作成したクロスアカウントIAMロールをクリックし、「許可を追加」→「インラインポリシーを作成」を選択します。
ポリシーエディタで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",
"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"
}
}
}
]
}
次へ進み、ポリシー名を入力して「ポリシーの作成」をクリックします。
3. 顧客管理VPC設定
顧客管理VPCの設定に従い、以下のようにネットワークを構築します。
- VPC
- DNSホスト名、DNS解決を有効にする
- サブネット
- 異なるAZのサブネットを2つ
- NATゲートウェイ用のサブネットを1つ
- インターネットゲートウェイ
- NATゲートウェイ
- セキュリティグループ
- アウトバウンド:全許可
- インバウンド:同SGからの全TCP, UDPを許可
実際に構築した例:
4. ネットワーク設定
資格情報作成ページの「高度な設定」をクリックし、ネットワーク構成で「新しいネットワーク設定を追加」をクリックします。
以下のように設定します。
- ネットワーク設定名:作成するネットワーク設定の名称
- VPC ID:3で作成したVPCのID
- サブネットID:3で作成したサブネットのID
- セキュリティグループID:3で作成したセキュリティグループのID
実際の設定例:
5. 資格情報設定
以下を設定します。
- 資格情報の設定名:作成する資格情報の名称
- ロールARN:1で作成したクロスアカウントIAMロールのARN
設定が完了したら、「資格情報を作成して続行」をクリックします。
確認&作成
設定内容を確認し、「ワークスペースを作成」をクリックします。
作成が完了したら、ワークスペースのステータスが「Running」となり利用可能になります。
注意点
アカウントコンソールのワークスペース一覧からワークスペースを削除しても、ワークスペースのリソースは自動的に削除されないため注意が必要です。関連リソースはすべて自分で削除する必要があります。
- クイックスタートで作成した場合:CloudFormationのスタックを開き、「削除」を実行。VPC等は自分で削除する必要あり。
- 手動作成した場合:関連リソースをすべて手動で削除。
ワークスペースを削除する | Databricks on AWS
まとめ
DatabricksワークスペースをAWSにデプロイする方法についてご紹介しました。
AWSへのデプロイはなんとなく面倒なイメージがあったのですが、実際に試してみるとドキュメントやガイドも充実していてわかりやすく、独自構成にする場合でもそこまで大変には感じませんでした。特に、ネットワークやストレージを独自に管理したい等の要件がない場合は、クイックスタートで作成すると非常に簡単なのでおすすめです。
ただし、作成されたリソースの削除は基本的に手動で行わなければならないため注意が必要です。リソースが残っている場合、使用していなくても課金が発生してしまいます。