AssumeRole ポリシーを使用したクロスアカウント Kinesis アクセス
AWS では、クロスアカウントアクセスを設定できるため、あるアカウントのコンピューティングが別のアカウントの AWS サービスにアクセスできます。 「 チュートリアル: インスタンスプロファイルを使用して S3 アクセスを設定する」で説明されているように、アクセスを許可する 1 つの方法は、別のアカウントのサービスへの直接アクセスをアカウントに付与することです。 他のサービスへのアクセスを許可する別の方法は、アカウントが別のアカウントで ロールを引き受け ることを許可することです。
AWS アカウント A とアカウント ID <deployment-acct-id>
と AWS アカウント B とアカウント番号 <kinesis-owner-acct-id>
を考えてみましょう。アカウント A is used when deploying your Databricks workspace: EC2 services are managed by this account. Kinesis はアカウント B によって管理されます。
この記事では、 AWS AssumeRole アクションを使用してアカウント B の Kinesis にアカウント B のロールとしてアクセスするようにアカウント A を構成する手順について説明します。このアクセスを有効にするには、 Databricks admin 設定のアカウント A とアカウント B で設定を行い、 Databricks クラスターを設定するとき、および Kinesisにアクセスするノートブックを実行するときに実行します。
必要条件
AWSIAMデプロイのAWS DatabricksAWSアカウントとKinesis サービスの アカウントにある ロールとポリシー への管理者アクセス。
ステップ 1: Kinesis アカウントでクロスアカウントロールを設定する
-
Kinesis AWS アカウントで、IAM サービスに移動し、[ ロール ] タブをクリックします。
-
[ ロールを作成 ] をクリックします。 [信頼されたエンティティのタイプを選択] パネルで、[ 別の AWS アカウント ] をクリックします。 Databricks AWSアカウントのアカウントIDを貼り付けます、
<deployment-acct-id>
。オプションで、外部 ID を指定できますが、必須ではありません。 -
[ 次へ: アクセス許可 ] をクリックし、このロールに Kinesis へのアクセスアクセス許可を付与します。 独自の JSON を指定することも、 AmazonKinesisFullAccess ポリシーを使用することもできます。
-
[次へ: 確認 ] をクリックし、ロールに名前を付けます (例:
KinesisCrossAccountRole
)。 -
[ ロールを作成 ] をクリックします。 ロールのリストが表示されます。
-
[ロール] リストで [
KinesisCrossAccountRole
] をクリックし、信頼されたアカウントに次のような JSON ポリシーが含まれていることを確認します。JSON{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["arn:aws:iam::<deployment-acct-id>:root"],
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
} -
ロールの ARN をコピーします (例:
arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole
)。
ステップ 2: Databricks デプロイアカウントでロールを引き受ける設定する
-
Databricks デプロイの AWS アカウントで、IAM サービスに移動し、[ ロール ] タブをクリックします。
-
[ ロールを作成 ] をクリックします。 [信頼されたエンティティのタイプを選択] パネルで、[ AWS サービス ] をクリックし、[ EC2 ] サービスをクリックします。
-
[次へ:アクセス許可] をクリックします。
-
[次へ: 確認 ] をクリックし、ロールに名前を付けます (例:
DatabricksToKinesisAssumeRole
)。 -
[ ロールを作成 ] をクリックします。 ロールのリストが表示されます。
-
「ロール」リストで、「
DatabricksToKinesisAssumeRole
」をクリックします。 -
[権限] タブで、[
] をクリックします。
-
[JSON ] タブをクリックします。
-
このポリシーをコピーし、ステップ 1 の
KinesisCrossAccountRole
のロール ARN を [リソース ] フィールドに貼り付けます。JSON{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1487884001000",
"Effect": "Allow",
"Action": ["sts:AssumeRole"],
"Resource": ["arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole"]
}
]
} -
「 ポリシーの確認 」をクリックします。
-
[名前] フィールドに、ポリシー名 (
DatabricksToKinesisAssumeRole
など) を入力します。 -
「 ポリシーの作成 」をクリックします。
-
[
DatabricksToKinesisAssumeRole
]を選択します。 ステップ 3 で使用するためにインスタンスプロファイル ARN を保存し、次のステップで使用するためにロール ARN を保存します。 -
Databricks ワークスペースのデプロイに使用されるロールのポリシーを更新し、
iam:PassRole
アクションをポリシーに追加します。iam:PassRole
アクションでは、このステップで作成したDatabricksToKinesisAssumeRole
のロール ARN を使用する必要があります。保存後、次のようなポリシーが必要です。JSON{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1403287045000",
"Effect": "Allow",
"Action": [
"ec2:AssociateDhcpOptions",
"ec2:AssociateRouteTable",
"ec2:AttachInternetGateway",
"ec2:AttachVolume"
],
"Resource": ["*"]
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": ["arn:aws:iam::<deployment-acct-id>:role/DatabricksToKinesisAssumeRole"]
}
]
}
ステップ 3: インスタンスプロファイル DatabricksToKinesisAssumeRole
を Databricks に追加する
- 設定ページに移動します。
- [ インスタンスプロファイル ] タブをクリックします。
- ステップ 2、
arn:aws:iam::<deployment-acct-id>:instance-profile/DatabricksToKinesisAssumeRole
で保存したインスタンスプロファイル ARN を使用して、インスタンスプロファイルDatabricksToKinesisAssumeRole
を追加します。
ステップ 4: インスタンスプロファイルを使用してクラスターを作成する
- クラスターを選択または作成します。
- [詳細設定 ] セクションを開きます。
- 「インスタンス」 タブで、ステップ3で追加したインスタンスプロファイルを選択します
DatabricksToKinesisAssumeRole
。 - クラスターを開始します。
ステップ 5: Kinesis への接続を検証する
-
ノートブックを作成し、ステップ 4 で作成したクラスターにアタッチします。
-
Spark
readStream
メソッドのroleArn
オプションを設定して、クラスター (DatabricksToKinesisAssumeRole
) にアタッチした IAMロールから指定した引き受けロール (KinesisCrossAccountRole
) を使用します。Pythonkinesis = spark.readStream \
.format("kinesis") \
.option("streamName", "testStream") \
.option("region", "us-east-1") \
.option("roleArn", "arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole") \
.option("initialPosition", "earliest") \
.load()
display(kinesis)このコードサンプルでは、Kinesis ストリーム名が
testStream
であり、us-east-1
リージョンに存在することを前提としています。 外部 ID を使用してKinesisCrossAccountRole
を作成した場合は、次のオプションを追加します。Python.option("roleExternalId", "myExternalCode")
Kinesis サービスの VPC エンドポイントを作成した場合は、次のオプションを追加します。
<region>
を VPC エンドポイントの AWS リージョンに置き換えます。Python.option("stsEndpoint", "sts.<region>.amazonaws.com")
-
次のような有効な結果を確認します。