背景・目的
こちらの「Databricksの特徴とアカウント開設の手順を整理した」では、Databricksの特徴を簡単に整理しましたが、今回はDatabricksのWorkspace(ワークスペース)について整理します。
また、アカウントコンソールでワークスペースの作成も試してみます。
まとめ
ワークスペースは、下記の特徴があります。
- Databricksのデプロイ単位
- アカウント内に複数のワークスペースを作成可能
- Unity Catalogにより、複数のワークスペースを一元的に管理される
- Databricksのアセットにアクセスするための環境
- オブジェクトをフォルダで整理可能
- データオブジェクトとコンピューティングリソースへのアクセスを提供する
イメージ図
DatabricksのWorkspaceとAWSのリソースは、下記の関係(構成)になるかと思われます。
概要
ワークスペースとは
こちらのDatabricksのドキュメント「Databricksの概念>アカウントとワークスペース」には、下記の記載があります。
Databricks において、ワークスペースはクラウド内の Databricks デプロイメントであり、チームが Databricks アセットにアクセスするための環境として機能します。組織は、ニーズに応じて、複数のワークスペースを使用するか、ワークスペースを 1 つだけ使用するかを選択できます。
Databricks アカウントは、複数のワークスペースを含めることができる単一のエンティティです。Unity Catalog が有効なアカウントであれば、アカウント内のすべてのワークスペースにわたって、ユーザーとデータへのアクセスを一元的に管理できます。請求とサポートもアカウントレベルで処理されます。
ワークスペース は、すべての Databricks 資産にアクセスするための環境です。ワークスペースは、オブジェクト (ノートブック、ライブラリ、ダッシュボード、エクスペリメント) を folders に整理し、データ オブジェクトとコンピューティング リソースへのアクセスを提供します。
整理すると、下記の特徴があるようです。
- Databricksのデプロイ単位
- アカウント内に複数のワークスペースを作成可能
- Unity Catalogにより、複数のワークスペースを一元的に管理される
- Databricksのアセットにアクセスするための環境
- オブジェクトをフォルダで整理可能
- データオブジェクトとコンピューティングリソースへのアクセスを提供する
実践
アカウントコンソールを使用したワークスペースの作成を元に試してみます。
事前準備
ワークスペースデプロイ用の IAMロールを作成する
ワークスペースデプロイ用の IAMロールを作成するを元に試します。
クロスアカウント IAMロール for Databricks ワークスペースのデプロイを作成して設定します。 このロールは、コンピュートおよび VPC リソースを作成および管理するために、Databricks に AWS アカウントへの制限付きアクセスを付与します。
ステップ 1: クロスアカウント IAM ロールを作成する
-
事前にDatabricksのアカウントIDを確認しておきます。
-
AWSにサインインし、IAMのナビゲーションで「ロール」を選択します。
-
「ロールを作成」をクリックします。
-
下記を番号の順に入力し、「次へ」をクリックします。
- 信頼されたエンティティタイプの①「AWSアカウント」を選択
- ②「別のAWSアカウント」を選択
- ③アカウントIDには、「414351767826」を入力。※Databricksの固定アカウント
- ④外部IDを要求をチェック
- ⑤外部IDに、DatabricksのアカウントIDを入力
-
アクセス許可は何も選択せずにそのまま「次へ」をクリックします。
-
ロール名を入力し、「ロールを作成」をクリックします。
ステップ 2: アクセスポリシーを作成する
-
IAM コンソールの [ロール] セクションで、ステップ 1 で作成した IAMロールをクリックします。
-
JSONエディタを選択し、下記のポリシーを貼り付け、「次へ」をクリックします。
{ "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" } } } ] }
-
ポリシーの名前を設定し、「ポリシーの作成」をクリックします。
ステップ 3: Databricksで資格情報の構成を作成する
上記で、IAMロールを作成後、そのロールのIDを使用するCredentialを作成しDatabricksに通知できる。
- Databricksのアカウントコンソールにサインインします。
- ナビゲーションペインで「クラウドリソース」を選択します。
- クラウドリソースの画面で「資格情報の設定を追加」をクリックします。
- 下記を入力し、「追加」をクリックします。
ワークスペースデプロイ用の S3 バケットを作成する
こちらは、「ワークスペースデプロイ用の S3 バケットを作成する」を参考に、作成します。
ここでは、Databricks ワークスペース展開のルート ストレージを作成および構成します。
ルートストレージ作成のベストプラクティス
- ワークスペースのデプロイに使用するバケットは、ワークスペースのルートストレージと呼ばれます。 ルートストレージを使用して本番環境顧客データを保存しないこと。
- 本番データ用に追加の S3 バケットまたはその他のデータソースを作成し、オプションでそれらの DBFS マウントポイントを作成する。
- S3 バケットは、Databricks ワークスペースのデプロイと同じ AWS リージョンに存在する必要があります。
- Databricks では、Databricks 専用の S3 バケットを使用し、他のリソースやサービスと共有しないことをお勧めします。
ステップ 1: ストレージ設定を作成し、バケットポリシーを生成する
-
Databricsのアカウントコンソールにサインインし、ナビゲーションペインの「クラウドリソース」をクリックします。
-
下記を入力し、「ポリシーを生成」をクリックします。
- ストレージ設定名
- バケット名
-
S3バケットポリシーが表示されるのでコピーします。
{ "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:::XXXXX/*", "arn:aws:s3:::XXXXX" ], "Condition": { "StringEquals": { "aws:PrincipalTag/DatabricksAccountId": [ "XXXXXXXXXXXXX" ] } } } ] }
-
「追加」ボタンをクリックします。
ステップ 2:
- AWSにサインインします。
- 上記のステップ1でストレージ設定を作成した際に使用した名前でS3バケットを作成します。
- バケットポリシーを編集し、上記のステップ1でコピーしたポリシーを貼り付けて「変更の保存」をクリックします。
アカウントコンソールを使用したワークスペースの作成
カスタム AWS 設定でワークスペースを作成する
アカウントコンソールを使用したワークスペースの作成を元に試してみます。
-
下記を設定し、「保存」をクリックします。
ワークスペースの状態を表示する
ワークスペースにログインする
考察
今回は、ワークスペースを作成してみました。このハンズオンを通してDatabricksアカウントを介してクライアントのVPC(EC2インスタンスを作成する)や、S3バケットへアクセスしていることがわかりました。
今後は、Unity Catalogやワークスペース上でオブジェクトを作成していきたいと思います。
また、作成したワークスペースは異なるドメインになるようです。Databricksのコンソール内でワークスペースを切り替えることができないようです。。(Azureならできるようです。)
そのため、AWS Identy Centerを設定して個別にワークスペースを登録してログインすることも試してみたいです。
参考