🔥

クロスアカウントでAmazon SageMaker Experimentsを利用する

2021/11/15に公開

小ネタです。アカウントA(アカウントID:111111111111)にあるSageMaker Experimentsに対して、アカウントB(アカウントID:222222222222)のCloud 9からアクセスする方法です。需要あるかわかりませんがやってみたのでまとめます。

アカウントAでSageMaker Studioを立てる

SageMaker Experimentsを利用するには、SageMaker Studioが必要です。SageMakerのマネジメントコンソールにいき、Amazon SageMaker StudioのリンクをクリックしSageMaker Domainをセットアップします。

作成した後、[実行ロール]に arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS というIAMロールが作成されるのでメモしておきます。

アカウントBでAssume RoleができるIAMポリシーを作成する

アカウントBでマネジメントコンソールにログインし、IAMポリシーを作成します。IAMポリシーは以下になります。arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS は先ほど作成された実行ロールに置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS"
            ]
        }
    ]
}

アカウントBでIAMロールを作成するIAMロールを作成する

今回はCloud 9で実行するので、IAMロール作成画面の[ユースケースの選択]では[EC2]を選択します。そして先ほど作成したIAMポリシーをアタッチしIAMロールを作成します。このときのIAMロールのARN(例:arn:aws:iam::222222222222:role/cloud9)をメモしておきます。

アカウントAのSageMaker実行ロールを編集する

アカウントAに戻り、SageMaker実行ロール(AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS)の画面にいき、[信頼関係]タブを選択、[信頼関係の編集]をクリックして以下のように編集します。arn:aws:iam::222222222222:role/cloud9 は先ほど作成したアカウントBのIAMロールに置き換えてください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222222222222:role/cloud9",  # 追加
        "Service": "sagemaker.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

以上で、クロスアカウントでアクセスできる準備は整いました。

アカウントBのCloud 9からクロスアカウントする

アカウントBからアカウントAのSageMaker Experimentsにアクセスします。アカウントBでCloud 9のコンソール画面にいき、[Create Environment]からインスタンスを立ち上げます。このとき、先ほど作成したIAMロール(arn:aws:iam::222222222222:role/cloud9)を選択します。

Cloud9が起動したら以下のリンクを参考にEC2 IAMロールの権限で利用できるようにします。

Cloud9からIAM Roleの権限でAWS CLIを実行する | DevelopersIO

Cloud9のターミナル画面から以下のコマンドを実行してSageMakerおよびSageMaker Experimentsのパッケージを入れます。

$ pip install -qU boto3 "sagemaker>=1.71.0,<2.0.0"
$ pip install sagemaker-experiments
$ pip install pandas

以下のスクリプトを適当なファイル(sagemaker.pyなど)で保存します。arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS は先ほど作成された実行ロールに置き換えてください。

from time import strftime, gmtime
import boto3
import sagemaker
from smexperiments.experiment import Experiment

sts_connection = boto3.client('sts')
assume_role = sts_connection.assume_role(
    RoleArn="arn:aws:iam::111111111111:role/service-role/AmazonSageMaker-ExecutionRole-YYYYMMDDTHHMMSS",
    RoleSessionName="cross_acct"
)

boto_session = boto3.Session(
    region_name="ap-northeast-1",
    aws_access_key_id=assume_role['Credentials']['AccessKeyId'],
    aws_secret_access_key=assume_role['Credentials']['SecretAccessKey'],
    aws_session_token=assume_role['Credentials']['SessionToken'],
)

create_date = strftime("%Y-%m-%d-%H-%M-%S", gmtime())
experiment_evaluate = Experiment.create(
    experiment_name="assume-role-experiment-evaluate-{}".format(create_date),
    description="Example experiment_evaluate",
    sagemaker_boto_client=boto_session.client('sagemaker'),
)

print(experiment_evaluate)

このスクリプトを実行した後、アカウントAのSageMaker Studioにいき、SageMaker Experimentsが作成できればOKです。

sagemaker-experiments

Discussion