メインコンテンツまでスキップ

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 アカウントでクロスアカウントロールを設定する

  1. Kinesis AWS アカウントで、IAM サービスに移動し、[ ロール ] タブをクリックします。

  2. [ ロールを作成 ] をクリックします。 [信頼されたエンティティのタイプを選択] パネルで、[ 別の AWS アカウント ] をクリックします。 Databricks AWSアカウントのアカウントIDを貼り付けます、<deployment-acct-id>。オプションで、外部 ID を指定できますが、必須ではありません。

  3. [ 次へ: アクセス許可 ] をクリックし、このロールに Kinesis へのアクセスアクセス許可を付与します。 独自の JSON を指定することも、 AmazonKinesisFullAccess ポリシーを使用することもできます。

  4. [次へ: 確認 ] をクリックし、ロールに名前を付けます (例: KinesisCrossAccountRole)。

  5. [ ロールを作成 ] をクリックします。 ロールのリストが表示されます。

  6. [ロール] リストで [ 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"
    }
    ]
    }
  7. ロールの ARN をコピーします (例: arn:aws:iam::<kinesis-owner-acct-id>:role/KinesisCrossAccountRole)。

ステップ 2: Databricks デプロイアカウントでロールを引き受ける設定する

  1. Databricks デプロイの AWS アカウントで、IAM サービスに移動し、[ ロール ] タブをクリックします。

  2. [ ロールを作成 ] をクリックします。 [信頼されたエンティティのタイプを選択] パネルで、[ AWS サービス ] をクリックし、[ EC2 ] サービスをクリックします。

  3. [次へ:アクセス許可] をクリックします。

  4. [次へ: 確認 ] をクリックし、ロールに名前を付けます (例: DatabricksToKinesisAssumeRole)。

  5. [ ロールを作成 ] をクリックします。 ロールのリストが表示されます。

  6. 「ロール」リストで、「 DatabricksToKinesisAssumeRole」をクリックします。

  7. [権限] タブで、[インラインポリシー] をクリックします。

  8. [JSON ] タブをクリックします。

  9. このポリシーをコピーし、ステップ 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"]
    }
    ]
    }
  10. ポリシーの確認 」をクリックします。

  11. [名前] フィールドに、ポリシー名 ( DatabricksToKinesisAssumeRoleなど) を入力します。

  12. ポリシーの作成 」をクリックします。

  13. [ DatabricksToKinesisAssumeRole]を選択します。 ステップ 3 で使用するためにインスタンスプロファイル ARN を保存し、次のステップで使用するためにロール ARN を保存します。

  14. 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 に追加する

  1. 設定ページに移動します。
  2. [ インスタンスプロファイル ] タブをクリックします。
  3. ステップ 2、arn:aws:iam::<deployment-acct-id>:instance-profile/DatabricksToKinesisAssumeRoleで保存したインスタンスプロファイル ARN を使用して、インスタンスプロファイル DatabricksToKinesisAssumeRole を追加します

ステップ 4: インスタンスプロファイルを使用してクラスターを作成する

  1. クラスターを選択または作成します。
  2. [詳細設定 ] セクションを開きます。
  3. 「インスタンス」 タブで、ステップ3で追加したインスタンスプロファイルを選択しますDatabricksToKinesisAssumeRole
  4. クラスターを開始します。

ステップ 5: Kinesis への接続を検証する

  1. ノートブックを作成し、ステップ 4 で作成したクラスターにアタッチします。

  2. Spark readStreamメソッドの roleArn オプションを設定して、クラスター (DatabricksToKinesisAssumeRole) にアタッチした IAMロールから指定した引き受けロール (KinesisCrossAccountRole) を使用します。

    Python
    kinesis = 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")
  3. 次のような有効な結果を確認します。

    アクティブ Kinesis ストリーム