ValueError: Must setup local AWS configuration の対処方法

· 6min · Masataka Kashiwagi

Step Functions で SageMaker ProceesingJob を使ってカスタムコンテナを実行した際に,その実行スクリプト内で ExperimentAnalytics の API を使用していたところ,"ValueError: Must setup local AWS configuration with a region supported by SageMaker." というエラーが発生したので,その対処方法をメモしておく.

結論から言うと,エラー内容にある通り region の指定を行うことで解決できる.

方法としては2つある.

  • "boto_session" と "sagemaker_client" の "region_name" を指定する
  • 環境変数に "AWS_DEFAULT_REGION" を設定する

2つ目の方法の Step Functions の定義ファイルに環境変数: AWS_DEFAULT_REGION を1行追記するのが簡単である.

Configuration Error

SageMaker Experiments に保存されている実験結果は sagemaker.analytics.ExperimentAnalytics の API 使うことで取得することができる.今回 Step Functions で SageMaker ProceesingJob を使ってカスタムコンテナを実行した際に,以下のエラーが発生した.

ValueError: Must setup local AWS configuration with a region supported by SageMaker.

Configuration は公式ドキュメントを見ると,以下のことが書かれている.

Configuration - Overview
Boto3 looks at various configuration locations until it finds configuration values. Boto3 adheres to the following lookup order when searching through sources for configuration values:

  • A Config object that's created and passed as the config parameter when creating a client
  • Environment variables
  • The ~/.aws/config file

上から順番に優先度が高いものになっていて,下位で設定している内容よりも上位で設定した内容が優先的に反映される.

今回の場合は,1番目と2番目は特段設定していないので,3番目が採用されて問題ないかなと思っていたが,上述のエラーが発生した.AWS のクレデンシャル情報(config, credentials)はローカルの ~/.aws/ 配下に置かれており,build 時にローカルにあるファイルを volumes マウントしてコンテナ内と同期している.

この設定では上手くいかなかったので,1番目 or 2番目の設定を行ったところ正常に動作したので,こちらの方法を記載しておく.もし,volumes マウントの方法で上手くいく方法があれば教えて下さい!

Config object を boto3 client に渡す方法

公式ドキュメントに記載されている優先度が1番高い方法である.botocore.config.Config をインスタンス化して使うことで解決する方法になるが,今回はわざわざ Config object を使わずに region_name を指定する方法を説明する.

import boto3
import sagemaker

# sessionとclientの設定を行う
boto_session = boto3.session.Session(region_name="ap-northeast-1")
sagemaker_client = boto_session.client(service_name='sagemaker', region_name="ap-northeast-1")
sagemaker_session = sagemaker.session.Session(boto_session=boto_session, sagemaker_client=sagemaker_client)

# ExperimentAnalyticsをインスタンス化する
trial_component_analytics = sagemaker.analytics.ExperimentAnalytics(
    experiment_name='sample-experiments01',
    sagemaker_session=sagemaker_session
)

# データフレーム化
analytics_tables = trial_component_analytics.dataframe()

コードの流れは以下になる.

  • boto_session と sagemaker_client を作成する
  • sagemaker.session.Session の引数にそれぞれを渡す
  • sagemaker_session を sagemaker.analytics.ExperimentAnalytics の引数に渡す
  • 取得した実験結果をデータフレーム化する

ここで,冒頭の "boto_session" と "sagemaker_client" を作成する部分で,boto3.session.Session の "region_name" と,この session を使った client の "region_name" に該当する region を指定する必要がある.この2つをセットしておくことで,今回発生したエラーを回避することができる.

この場合はカスタムコンテナで実行するスクリプトの修正変更が必要になってくるが,次に説明する環境変数に渡す方法はこの辺りの修正は必要ないので,簡単かなと思う.

環境変数を設定する方法

Step Functions のワークフローを定義する json ファイルの Environment 変数に "AWS_DEFAULT_REGION" を設定する方法である.

Step Functions の定義ファイルのパラメータ部分は下記のような感じである.(今回は SageMaker ProcessingJob を使って実行している)

"Parameters": {
  "AppSpecification": {
    "ImageUri": "hogehoge.dkr.ecr.ap-northeast-1.amazonaws.com/mlops-experiments:latest",
    "ContainerEntrypoint": [
    "python3",
    "/opt/ml/code/get_experiments.py"
    ]
  },
  "Environment": {
    "AWS_DEFAULT_REGION": "ap-northeast-1"
  }
}

スクリプトの中身は以下になり.session の設定が必要なくなる.

import sagemaker

# ExperimentAnalyticsをインスタンス化する
trial_component_analytics = sagemaker.analytics.ExperimentAnalytics(
    experiment_name='sample-experiments01'
)

# データフレーム化
analytics_tables = trial_component_analytics.dataframe()

今回は,Step Functions で SageMaker ProceesingJob を使った際に発生したエラーの対処方法を備忘録として残した.

Configuration の設定に優先順位があることを知ったので,この辺りは今回に限らず注意が必要だなと思った.今回のエラーに対する対処方法は複数あるので,開発している状況に合わせて使い分けていければと思う.

あと,個人的には実行している Step Functions の region をセットして欲しい気持ちもあるが,まーこれは状況次第なので,なんとも言えない気もしている...

参考


このエントリーをはてなブックマークに追加

ブログ記事を読んで頂き,ありがとうございます!もしこの記事が良かったり参考になったら,「Buy me a coffee」ボタンから☕一杯をサポートして頂けるとモチベーションが上がります!どうぞよろしくお願いします🤩