「Amazon SageMaker Studioを使用してAmazon RedshiftクラスターのクロスアカウントアクセスをVPCピアリングで構成する」
Using Amazon SageMaker Studio to configure cross-account access to Amazon Redshift cluster with VPC peering.
クラウドコンピューティングにより、計算能力とデータの利用可能性が向上したことで、機械学習(ML)は今やあらゆる業界に影響を与え、すべてのビジネスと業界の中核をなしています。
Amazon SageMaker Studioは、ウェブベースの視覚的なインターフェースを備えた最初の完全統合型ML開発環境(IDE)です。すべてのML開発手順を実行し、モデルの構築、トレーニング、展開に必要な各ステップへの完全なアクセス、制御、可視性を持つことができます。
Amazon Redshiftは、完全に管理された高速で安全かつスケーラブルなクラウドデータウェアハウスです。組織は通常、Amazon Redshiftなどのデータウェアハウスに格納されたデータからの予測を取得するためにSageMaker Studioを使用したいと考えることがあります。
AWS Well-Architected Frameworkで説明されているように、アカウント間でワークロードを分離することで、組織は共通のガードレールを設定しながら環境を分離することができます。これは特定のセキュリティ要件や、プロジェクトやチーム間のコスト管理とモニタリングを簡素化するために特に有用です。マルチアカウントアーキテクチャを持つ組織では、通常、Amazon RedshiftとSageMaker Studioが2つの別々のAWSアカウントにあります。また、Amazon RedshiftとSageMaker Studioは、セキュリティを向上させ、不正アクセスのリスクを低減するために、プライベートサブネットで構成されることが一般的です。
Amazon Redshiftは、RA3ノードタイプを使用する場合にネイティブでクロスアカウントデータの共有をサポートしています。DS2やDC2などの他のAmazon Redshiftノードタイプを使用している場合は、VPCピアリングを使用してAmazon RedshiftとSageMaker Studioの間にクロスアカウント接続を確立することができます。
この記事では、Amazon RedshiftプロデューサーアカウントにあるAmazon Redshiftクラスターを、同じリージョン内の別のAWSアカウントにあるSageMaker StudioにVPCピアリングを使用してクロスアカウント接続するための手順をステップバイステップで説明します。
ソリューションの概要
まず、Amazon Redshiftデータウェアハウスを持つプロデューサーアカウントと、SageMaker Studioが設定されているAmazon SageMaker MLユースケースのコンシューマーアカウントの2つのAWSアカウントから始めます。以下は、ワークフローの概要です:
- コンシューマーアカウントで
VPCOnly
モードでSageMaker Studioをセットアップします。これにより、SageMakerがスタジオノートブックにインターネットアクセスを提供しないようになります。すべてのSageMaker Studioトラフィックは指定されたVPCとサブネットを介して行われます。 - SageMaker Studioドメインを更新して、ユーザープロファイル名を伝播するために
SourceIdentity
をオンにします。 - Amazon Redshiftプロデューサーアカウントで、SageMaker Studio IAMロールがAmazon RedshiftにアクセスするためにアサムするIAMロールを作成します。
- SageMaker Studioコンシューマーアカウント内のSageMaker IAM実行ロールを更新し、SageMaker StudioがAmazon Redshiftプロデューサーアカウントのロールをアサムするために使用するようにします。
- Amazon RedshiftプロデューサーアカウントとSageMaker Studioコンシューマーアカウント間にVPCピアリング接続を設定します。
- コンシューマーアカウントのSageMaker StudioでAmazon Redshiftをクエリします。
以下の図は、ソリューションアーキテクチャを示しています。
前提条件
この記事の手順では、Amazon RedshiftがAmazon Redshiftプロデューサーアカウントのプライベートサブネットで起動されていることを前提としています。パブリックサブネットでAmazon Redshiftを起動する場合と比べて、プライベートサブネットでの起動は、インターネットからの直接アクセスがないため、セキュリティと分離の追加のレイヤーを提供し、外部攻撃からより安全です。
パブリックライブラリをダウンロードするには、SageMakerコンシューマーアカウントでVPCとプライベートサブネットとパブリックサブネットを作成する必要があります。次に、パブリックサブネットにNATゲートウェイを起動し、プライベートサブネットにSageMaker Studioがインターネットにアクセスできるようにするためにインターネットゲートウェイを追加します。プライベートサブネットへの接続の確立方法についての手順については、「Amazon VPCのプライベートサブネットに対してNATゲートウェイを設定する方法」を参照してください。
コンシューマーアカウントでVPCOnlyモードでSageMaker Studioをセットアップする
VPCOnly
モードでSageMaker Studioを作成するには、次の手順を実行します:
- SageMakerコンソールで、ナビゲーションペインでStudioを選択します。
- SageMaker Studioを起動し、Standard setupを選択し、Configureを選択します。
AWS IAM Identity Center(AWS Single Sign-Onの後継)をすでに使用してAWSアカウントにアクセスしている場合、認証に使用することができます。それ以外の場合は、IAMを使用して認証し、既存の委任されたロールを使用することができます。
- 一般設定セクションで、新しいロールを作成を選択します。
- IAMロールの作成セクションで、Amazon Simple Storage Service (Amazon S3) のバケットを任意に指定して、任意、特定、またはなしを選択し、ロールを作成を選択します。
これにより、AmazonSageMaker-ExecutionRole-00000000
のようなSageMaker実行ロールが作成されます。
- ネットワークとストレージセクションで、事前に作成したVPC、サブネット(プライベートサブネット)、セキュリティグループを選択します。
- VPCのみを選択し、次へを選択します。
SageMaker Studioドメインを更新してSourceIdentityをオンにし、ユーザープロファイル名を伝播させる
SageMaker StudioはAWS CloudTrailと統合されており、SageMaker StudioノートブックからのユーザーアクティビティとAPI呼び出しを監視および監査することができます。 SageMaker Studioを設定して、ユーザーアクティビティとAPI呼び出しをCloudTrailイベントで監視および監査するために、SageMaker Studioドメインにユーザープロファイル名を記録することができます。
複数のユーザープロファイルの中から特定のユーザーアクティビティを記録する場合、SageMaker Studioドメインをユーザープロファイル名で伝播するためにSourceIdentity
をオンにすることをお勧めします。これにより、特定のユーザーにアクションを帰属させるためにユーザー情報をセッションに永続化することができます。この属性は、ロールをチェーンするときにも永続化されるため、プロデューサーアカウントでのアクションを細かく表示できます。この投稿が作成された時点では、これをAWSコマンドラインインターフェース(AWS CLI)または任意のコマンドラインツールを使用してのみ設定できます。
この設定を更新するには、ドメイン内のすべてのアプリが停止または削除状態である必要があります。
次のコードを使用して、ユーザープロファイル名をSourceIdentity
として伝播するようにSageMaker Studioドメインを更新します:
update-domain
--domain-id <value>
[--default-user-settings <value>]
[--domain-settings-for-update "ExecutionRoleIdentityConfig=USER_PROFILE_NAME"]
これには、実行ロールの信頼関係にsts:SetSourceIdentity
を追加する必要があります。
Amazon RedshiftプロデューサーアカウントでSageMaker StudioがAmazon Redshiftにアクセスするために前提となるIAMロールを作成する
SageMakerがAmazon RedshiftにアクセスするためにアサムするIAMロールを作成するには、次の手順を実行します:
- Amazon RedshiftプロデューサーアカウントでIAMコンソールを開きます。
- ナビゲーションペインでRolesを選択し、ロールの作成を選択します。
- 信頼できるエンティティの選択ページで、カスタム信頼ポリシーを選択します。
- 以下のカスタム信頼ポリシーをエディタに入力し、SageMakerの消費者アカウントIDと作成したSageMakerの実行ロールを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<<SageMakerの消費者アカウントID>>:role/service-role/AmazonSageMaker-ExecutionRole-XXXXXX"
},
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
]
}
]
}
- 次へを選択します。
- 必要なアクセス許可の追加ページで、ポリシーの作成を選択します。
- 以下のサンプルポリシーを追加し、必要に応じて編集を行います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "GetRedshiftCredentials",
"Effect": "Allow",
"Action": "redshift:GetClusterCredentials",
"Resource": [
"arn:aws:redshift:<<redshiftリージョン名>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbname:<<redshiftクラスタ名>>/<<redshift-db名>>",
"arn:aws:redshift:<<redshiftリージョン名>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbuser:<<redshiftクラスタ名>>/${redshift:DbUser}",
"arn:aws:redshift:<<redshiftリージョン名>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:cluster:<<redshiftクラスタ名>>"
],
"Condition": {
"StringEquals": {
"redshift:DbUser": "${aws:SourceIdentity}"
}
}
},
{
"Sid": "DynamicUserCreation",
"Effect": "Allow",
"Action": "redshift:CreateClusterUser",
"Resource": "arn:aws:redshift:<<redshiftリージョン名>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbuser:<<redshiftクラスタ名>>/${redshift:DbUser}",
"Condition": {
"StringEquals": {
"redshift:DbUser": "${aws:SourceIdentity}"
}
}
},
{
"Effect": "Allow",
"Action": "redshift:JoinGroup",
"Resource": "arn:aws:redshift:<<redshiftリージョン名>>:<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:dbgroup:<<redshiftクラスタ名>>/*"
},
{
"Sid": "DataAPIPermissions",
"Effect": "Allow",
"Action": [
"redshift-data:ExecuteStatement",
"redshift-data:CancelStatement",
"redshift-data:ListStatements",
"redshift-data:GetStatementResult",
"redshift-data:DescribeStatement",
"redshift-data:ListDatabases",
"redshift-data:ListSchemas",
"redshift-data:ListTables",
"redshift-data:DescribeTable"
],
"Resource": "*"
},
{
"Sid": "ReadPermissions",
"Effect": "Allow",
"Action": [
"redshift:Describe*",
"redshift:ViewQueriesInConsole"
],
"Resource": "*"
}
]
}
- 名前を追加してポリシーを保存します。たとえば、
RedshiftROAPIUserAccess
などの名前を追加します。
SourceIdentity
属性は、元のSageMaker StudioユーザーのアイデンティティをAmazon Redshiftデータベースユーザーに関連付けるために使用されます。プロデューサーアカウントのユーザーの操作は、CloudTrailとAmazon Redshiftデータベースの監査ログを使用して監視することができます。
- 名前、レビュー、作成ページで、ロール名を入力し、設定を確認し、ロールを作成を選択します。
Amazon RedshiftプロデューサーアカウントでSageMaker Studioが仮定するSageMakerコンシューマーアカウントのIAMロールを更新します。
作成したロールが仮定するようにSageMaker実行ロールを更新するには、次の手順を実行します。
- SageMakerコンシューマーアカウントでIAMコンソールを開きます。
- ナビゲーションペインでロールを選択し、作成したSageMaker実行ロール(
AmazonSageMaker-ExecutionRole-*
)を選択します。 - アクセス許可ポリシーセクションで、アクセス許可を追加メニューを選択し、インラインポリシーの作成を選択します。
- エディタで、JSONタブに以下のポリシーを入力します。ここで、<StudioRedshiftRoleARN>はAmazon Redshiftプロデューサーアカウントで作成したロールのARNです。
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "<StudioRedshiftRoleARN>"
}
}
Amazon Redshiftプロデューサーアカウントで作成したロールのARNは、次のスクリーンショットに示すようにIAMコンソールで取得できます。
- ポリシーを確認を選択します。
- 名前にポリシーの名前を入力します。
- ポリシーを作成を選択します。
アクセス許可ポリシーは、以下のスクリーンショットのようになるはずです。
Amazon Redshift プロデューサーアカウントと SageMaker Studio コンシューマーアカウントの間に VPC ピアリング接続を設定する
SageMaker Studio VPC と Amazon Redshift VPC の間で通信を確立するためには、VPC ピアリングを使用して両方の VPC をピアリングする必要があります。以下の手順を実行して接続を確立してください:
- Amazon Redshift または SageMaker アカウントのいずれかで、Amazon VPC コンソールを開きます。
- ナビゲーションペインでピアリング接続を選択し、ピアリング接続の作成を選択します。
- 名前に接続の名前を入力します。
- ピアリングするローカル VPC を選択で、ローカル VPC を選択します。
- ピアリングする他の VPC を選択で、同じリージョンの別のアカウントの他の VPC を指定します。
- ピアリング接続の作成を選択します。
- VPC ピアリング接続を確認し、リクエストの受け入れを選択して有効にします。
VPC ピアリング接続が正常に確立された後、SageMaker および Amazon Redshift VPC の両方にルートを作成して接続性を完了します。
- SageMaker アカウントで Amazon VPC コンソールを開きます。
- ナビゲーションペインでルートテーブルを選択し、SageMaker に関連付けられた VPC を選択し、ルートを編集します。
- 宛先の Amazon Redshift VPC の CIDR とターゲットにピアリング接続を追加します。
- さらに、NAT ゲートウェイを追加します。
- 変更を保存を選択します。
- Amazon Redshift アカウントで Amazon VPC コンソールを開きます。
- ナビゲーションペインでルートテーブルを選択し、Amazon Redshift に関連付けられた VPC を選択し、ルートを編集します。
- 宛先の SageMaker VPC の CIDR とターゲットにピアリング接続を追加します。
- さらに、インターネットゲートウェイを追加します。
- 変更を保存を選択します。
インターネット経由ではなく、VPC インターフェースエンドポイントを使用して SageMaker Studio に VPC から接続することができます。VPC インターフェースエンドポイントを使用すると、VPC と SageMaker API またはランタイム間の通信は完全に AWS ネットワーク内で安全に行われます。
- SageMaker アカウントで VPC コンソールを開きます。
- ナビゲーションペインでエンドポイントを選択し、エンドポイントの作成を選択します。
- SageMaker VPC、それぞれのサブネット、および SageMaker ノートブックドメインの入出力 NFS トラフィックを許可する適切なセキュリティグループを指定し、VPC エンドポイントの作成を選択します。
SageMaker StudioのコンシューマーアカウントでAmazon Redshiftをクエリする
すべてのネットワーキングが正常に確立された後、次の手順に従って、AWS SDK for pandasライブラリを使用してSageMaker StudioのコンシューマーアカウントのAmazon Redshiftクラスタに接続します:
- SageMaker Studioで新しいノートブックを作成します。
- AWS SDK for pandasパッケージがインストールされていない場合は、次のコマンドを使用してインストールできます:
!pip install awswrangler #AWS SDK for pandas
このインストールは永続的ではなく、KernelGateway Appが削除された場合に失われます。カスタムパッケージはライフサイクル設定の一部として追加できます。
- 最初のセルに以下のコードを入力し、コードを実行します。アカウント設定に基づいて
RoleArn
とregion_name
の値を置き換えます:
import boto3
import awswrangler as wr
import pandas as pd
from datetime import datetime
import json
sts_client = boto3.client('sts')
# STSConnectionオブジェクトのassume_roleメソッドを呼び出し、ロールARNとロールセッション名を渡します。
assumed_role_object=sts_client.assume_role(
RoleArn="arn:aws:iam::<<REDSHIFT-PRODUCER-ACCOUNT-ID>>:role/<<redshift-account-role>>",
RoleSessionName="RedshiftSession"
)
credentials=assumed_role_object['Credentials']
# AssumeRoleが返す一時的な認証情報を使用してAmazon S3に接続します。
redshift_session=boto3.Session(
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'],
region_name="<<redshift-region-name>>",
)
- 新しいセルに以下のコードを入力し、コードを実行して現在のSageMakerユーザープロファイル名を取得します:
def get_userprofile_name():
metadata_file_path = '/opt/ml/metadata/resource-metadata.json'
with open(metadata_file_path, 'r') as logs:
metadata = json.load(logs)
return metadata.get("UserProfileName")
- 新しいセルに以下のコードを入力し、コードを実行します:
con_redshift = wr.redshift.connect_temp(
cluster_identifier="<<redshift-cluster-name>>",
database="<<redshift-db-name>>",
user=get_userprofile_name(),
auto_create=True,
db_groups=[<<list-redshift-user-group>>],
boto3_session = redshift_session
)
Amazon Redshiftを正常にクエリするには、データベース管理者がプロデューサーアカウントのAmazon Redshiftクラスタ内で新しく作成されたユーザーに必要な読み取り権限を割り当てる必要があります。
- 新しいセルに以下のコードを入力し、クエリをAmazon Redshiftテーブルに合わせて更新し、セルを実行します。これにより、データの処理と分析のためのレコードが正常に返されるはずです。
df = wr.redshift.read_sql_query(
sql="SELECT * FROM users",
con=con_redshift
)
ビジネス要件に基づいてデータ変換と分析を開始することができます。
クリーンアップ
定期的なコストを発生させないために、SageMaker VPCエンドポイント、Amazon Redshiftクラスタ、およびSageMaker Studioアプリ、ユーザー、ドメインを削除してください。また、作成したS3バケットとオブジェクトも削除してください。
結論
この記事では、VPCピアリングを使用して異なるアカウントのプライベートAmazon RedshiftとSageMaker StudioのVPC間のクロスアカウント接続を確立し、IAMロールチェーニングを使用してSageMaker StudioからAmazon Redshiftデータにアクセスする方法を紹介しました。また、ユーザーがSageMaker StudioからAmazon Redshiftにアクセスした際のユーザーのアイデンティティをログに記録する方法も説明しました。このソリューションにより、データにアクセスするためにアカウント間でデータを手動で移動する必要がなくなります。さらに、SageMaker StudioでAWS SDK for pandasライブラリを使用してAmazon Redshiftクラスタにアクセスし、MLユースケースのためのデータを準備する方法も説明しました。
Amazon RedshiftとSageMakerについての詳細は、Amazon Redshiftデータベース開発者ガイドとAmazon SageMakerドキュメントを参照してください。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles