[アップデート] AWSのサービスエンドポイントを表す環境変数とプロファイル設定が増えました

2023.07.09

しばたです。

私は以前AWS CLIのコマンドとAWS Tools for PowerShellのコマンドレットを比較表示するサイトを作ったことがあり、このサイトの運営のために定期的にAWS CLIの更新をチェックしています。

AWS CLIの更新はほとんどの場合で「新機能のAPIに対応した。」「新サービスに対応した。」の2パターンなのですが、直近のAWS CLI v1.29.0およびv2.13.0で

  • feature:configuration: Configure the endpoint URL in the shared configuration file or via an environment variable for a specific AWS service or all AWS services.

という珍しい内容の更新があったので調べた結果を本記事で共有します。

どの様な更新なのか?

この更新に対するAWSからのアナウンスはありませんでした。
ウェブ上の情報をいろいろ漁ってみた結果、boto3のGitHubで興味深い投稿を見つけました。

こちらは元々2021年に起票された機能追加のプルリクエストで、AWSの各サービスに対するエンドポイントをAWS_ENDPOINT_URL環境変数で上書き可能にするものです。
結果としてこのプルリクエストはマージされずクローズされていますが、当時の議論として

  • AWSにはサービス毎で固有のエンドポイントを持つ場合があるがそれはどうする?
  • この様な機能はboto3でなくbotocoreの責務では?
  • 環境変数だけでなく設定ファイルでも設定可能にすべきでは?
  • boto3(Python SDK)だけでなくAWS SDK全体で持つべき機能では?

といった点が挙げられていた様です。
AWS SDK全体としてはこのIssueで課題を管理しています。

で、今回ようやくAWS SDK(botocore)で上記機能を実装してAWS CLIでも使える様になったというのが実態でした。

GitHub上ではAWS CLIだけでなくAWS SDK for JavaScriptやAWS SDK for PHPも対象になっていますが、本日時点では未実装(対応中)となっており近いうちに実装されそうな雰囲気です。
(厳密な対応状況は後述のドキュメントに記載があります)

AWS SDKのドキュメント

というわけで今回の更新はAWS SDK全体にわたるものであり、詳細は以下のドキュメントに記載されています。

細かい話はこのドキュメントをご覧いただきたいですが、主要な部分を何点かピックアップして紹介しておきます。

環境変数の追加

まず初めにAWS各サービス共通のエンドポイントを表現するAWS_ENDPOINT_URL環境変数が追加されました。
未設定の場合は従来どおりサービス毎のデフォルトエンドポイントを使用します。

加えて各サービス固有のエンドポイントを表現するAWS_ENDPOINT_URL_"サービス名"環境変数も増えています。
例えばS3専用のエンドポイントであればAWS_ENDPOINT_URL_S3環境変数となります。

そして、上記個別のエンドポイント設定の有効・無効を制御するためにAWS_IGNORE_CONFIGURED_ENDPOINT_URLS環境変数が追加されています。
この環境変数をtrueに設定するとAWS_ENDPOINT_URLおよびAWS_ENDPOINT_URL_"サービス名"環境変数の設定内容は無視されます。

設定ファイルの追加

環境変数だけでなく共有設定ファイル(~/.aws/config)も機能追加されています。

設定ファイルの各プロファイルにendpoint_urlパラメーターが増え、AWS_ENDPOINT_URL環境変数と同様の意味合いを持つ様になっています。

~/.aws/config

# AWS_ENDPOINT_URL 環境変数と同様の設定
[profile dev]
endpoint_url = http://localhost:1234

各サービス毎のエンドポイントはservicesセクションを使うことで設定可能になっています。
例えばS3専用のエンドポイントを指定する場合は以下の様な記述をします。

~/.aws/config

# servicesセクションにサービス毎固有のエンドポイント記述
[services testing-s3-and-eb]
s3 = 
  endpoint_url = http://localhost:4567
elastic_beanstalk = 
  endpoint_url = http://localhost:8000

# 各プロファイルでは利用する services セクションを指定
[profile dev]
services = testing-s3-and-eb

いい感じですね。

対応状況

SDK毎の対応状況は以下に記載されています。

本日(2023年7月9日)時点では

  • AWS CLI : v1.29.0およびv2.13.0以降
  • AWS SDK for Python (boto3) *1 : v1.28.0以降 (botocore v1.31.0以降)
  • AWS SDK for .NET v3系 : v3.7.585.0以降

が対応済みです。
利用可能なSDKは順次増えていくことでしょう。

試してみた

ここからは実際に動作確認していきます。
私のクライアント環境(PowerShell 7.3.5 on Windows 11)にインストール済みのAWS CLI v2.13.0で試していきます。

PS C:\> aws --version
aws-cli/2.13.0 Python/3.11.4 Windows/10 exe/AMD64 prompt/off

はじめに特に何も設定しない状態であればaws s3 lsコマンド(S3)およびaws ec2 describe-regionsコマンド(EC2)は以下の様な値を返します。

PS C:\> aws s3 ls
2022-10-04 09:54:59 amazon-file-cache-test-20221001
2022-07-23 17:29:41 appstream-app-settings-ap-northeast-1-xxxxxxxxxxxx-xxxxxxxx
2023-01-12 12:31:10 appstream-app-settings-us-east-1-xxxxxxxxxxxx-xxxxxxxx
# ・・・後略・・・

PS C:\> aws ec2 describe-regions --query "Regions[].RegionName" --output json | ConvertFrom-Json
ap-south-1
eu-north-1
eu-west-3
# ・・・後略・・・

ここでAWS_ENDPOINT_URL環境変数を設定すると両サービスのエンドポイントが変わり共にエラーを返す様になります。

# AWS_ENDPOINT_URL 環境変数を設定
PS C:\> $env:AWS_ENDPOINT_URL="http://localhost:4567"

# S3, EC2両サービスともエンドポイントが変わりエラーとなる
PS C:\> aws s3 ls

Could not connect to the endpoint URL: "http://localhost:4567/"

PS C:\> aws ec2 describe-regions --query "Regions[].RegionName" --output json | ConvertFrom-Json

Could not connect to the endpoint URL: "http://localhost:4567/"

ここでAWS_ENDPOINT_URL環境変数はリセットしてAWS_ENDPOINT_URL_S3環境変数だけ設定してみます。

# AWS_ENDPOINT_URL_S3 環境変数だけ設定
PS C:\> $env:AWS_ENDPOINT_URL=""
PS C:\> $env:AWS_ENDPOINT_URL_S3="http://localhost:12345"

# AWS_ENDPOINT_URL_S3 環境変数によりS3のエンドポイントは変わる
PS C:\> aws s3 ls

Could not connect to the endpoint URL: "http://localhost:12345/"

# EC2のエンドポイントは変わらないのでエラー無く値を返す
PS C:\> aws ec2 describe-regions --query "Regions[].RegionName" --output json | ConvertFrom-Json
ap-south-1
eu-north-1
eu-west-3
# ・・・後略・・・

続けて共有設定ファイルを変えるパターンも試して上記と同様の結果を得られたことを確認しています。
(表記上内容が変わり映えしないので詳細は割愛します...)

servicesセクションを書く場所はprofileセクションの前後どちらでも問題ありませんでした。
また、存在しないservicesセクションを記載すると以下の様な設定エラーになりました。

# testing-s3-and-eb セクションを削除して設定ファイルを不整合な状態にした場合
PS C:\> aws s3 ls

The profile is configured to use the services section but the "testing-s3-and-eb" services configuration does not exist.

最後に

以上となります。

環境によってPrivate Endpointからのサービスアクセスが必要であったり、localstack等の開発ツールを使う場合などで独自のエンドポイント設定を必要とすることはそれなりにあるでしょう。
今回の更新によりこの様なエンドポイント設定をかなり簡易にできる様になったと思います。

必要に応じてぜひ使ってみてください。

脚注

  1. 厳密にはbotocoreに実装されboto3も対応となっている