[AWS] AWSアカウントベースのエンドポイントが増えました (現在はDynamoDBのみ対応)

[AWS] AWSアカウントベースのエンドポイントが増えました (現在はDynamoDBのみ対応)

Clock Icon2025.03.28

しばたです。

いつも通りAWS CLIの更新をチェックしていたところ、Ver.2.25.0の更新において「新規にAWSアカウント単位のエンドポイントを増やす。最初はDynamoDBだけ対応する。」旨の内容がありました。

  • feature:Endpoints: Generate and use AWS-account-based endpoints for compatible services when the account ID is available. At launch, DynamoDB is the first and only compatible service. The new endpoint URL pattern will be https://<account-id>.ddb.<region>.amazonaws.com. Additional services may be added in the future. See the documentation for details: https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html

本記事ではこちらの詳細を現時点で分かる範囲で解説していきます。

どういうことか

CHANGELOGに記載の通り詳細は以下のドキュメントにあります。

https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html

従来DynamoDBにアクセスする際のエンドポイントは

  • https://dynamodb.<region>.amazonaws.com (FIPSエンドポイントは除く)

という形でリージョン毎に分かれていましたが、今回新たに

  • https://<account-id>.ddb.<region>.amazonaws.com

という形のAWSアカウントID毎のエンドポイントが増えました。

AWS CLIの設定ファイル(~/.aws/credentials~/.aws/config)やAWS_ACCOUNT_ID環境変数などでアカウントIDの指定がある場合はこのアカウントID毎のエンドポイントを優先して使う様になります。

優先順位を明示する場合

2つのエンドポイントの優先順位を明示したい場合はAWS CLIの設定ファイルでaccount_id_endpoint_modeキーを指定するか、AWS_ACCOUNT_ID_ENDPOINT_MODE環境変数を設定すれば可能です。
指定可能な値は下表の通りです。

設定値 内容
preferred (デフォルト値) アカウントIDを取得できる場合はアカウントID毎のエンドポイントを優先して使う。
disabled 常にリージョン毎のエンドポイントを使う。 (従来の挙動)
required 常にアカウントID毎のエンドポイントを使う。アカウントIDを取得できない場合はエラーになる。

アカウントID毎のエンドポイントを使うメリット

ドキュメントによれば

Account-based endpoints help ensure high performance and scalability by using your AWS account ID to route requests for services that support this feature.

とあり、アカウントID毎のエンドポイントを選ぶことでパフォーマンスおよびスケーラビリティの改善を得られるそうです。
ただ、具体的にどの程度の効果が得られるのかについては記載がありませんでした。

本日時点ではアカウントID毎のエンドポイントは単純にリージョン毎のエンドポイントに対するCNAMEとなっており外から見える違いはありませんでした。
恐らくは「エンドポイントのホスト名を起点にして内部的なルーティング等が最適化されるのかな?」と予想します。

# リージョン毎のエンドポイント
$ dig dynamodb.ap-northeast-1.amazonaws.com +noall +ans
dynamodb.ap-northeast-1.amazonaws.com. 5 IN A   52.94.8.218

# アカウントID毎のエンドポイントは単なるCNAMEになっていた
$ dig 1111111111111.ddb.ap-northeast-1.amazonaws.com +noall +ans
1111111111111.ddb.ap-northeast-1.amazonaws.com. 900 IN CNAME dynamodb.ap-northeast-1.amazonaws.com.
dynamodb.ap-northeast-1.amazonaws.com. 5 IN A   13.248.69.6

# ちなみに存在しないアカウントIDやアカウントIDでない値を指定しても名前解決はできてしまう
$ dig invalid-value.ddb.ap-northeast-1.amazonaws.com +noall +ans
invalid-value.ddb.ap-northeast-1.amazonaws.com. 900 IN CNAME dynamodb.ap-northeast-1.amazonaws.com.
dynamodb.ap-northeast-1.amazonaws.com. 5 IN A   35.71.114.103

対応SDK

本日時点でこの機能に対応しているSDKは

  • AWS CLI : v2.25.0 および v1.38.0 以降
  • SDK for Go V2 : v1.35.0 以降
  • SDK for Java 2.x : v2.28.4 以降
  • SDK for Java 1.x : v1.12.771 以降
  • SDK for JavaScript 3.x : v3.656.0 以降
  • SDK for Kotlin : v1.3.37 以降
  • SDK for PHP 3.x : v3.318.0 以降
  • SDK for Python (boto3) : v1.37.0 以降
    • botocoreもv1.37.0 以降で対応
  • SDK for Ruby 3.x : v1.123.0 以降
  • SDK for Swift : v1.2.0 以降

となっています。

feature-aws-account-based-api-endpoints-01

現在非対応のSDKも将来的には対応するものと思います。
ちなみにAWS SDK for .NETがまだ非対応なので必然的にAWS Tools for PowerShellも非対応となっています。

動作確認

ここからは実際にAWS CLIを使って動作確認していきます。

注意点

バグなのか意図した挙動なのかはっきりしないのですが、現状AWS CLIにおいてはAWS_ACCOUNT_ID環境変数を指定してもエンドポイントは変わらず、設定ファイルでAWSアカウントIDを指定する必要がありました。

botocoreの方のプルリクエストには環境変数のサポートが記述されてるのでなんとなくですがバグな予感がします。

https://github.com/boto/botocore/pull/3400

AWS CLIのプルリクエストはこちらになります。

https://github.com/aws/aws-cli/pull/9371

ちなみにAWS_ACCOUNT_ID_ENDPOINT_MODE環境変数の指定は期待通り反映されました。

従来の挙動

今回は記事執筆時点で最新のAWS CLI Ver.2.25.4 on Windows 11な環境で動作確認しています。

# AWS CLI Ver.2.25.4 on Windows 11
PS C:\> aws --version
aws-cli/2.25.4 Python/3.12.9 Windows/11 exe/AMD64

テスト用に以下のtestプロファイルを作成しておき、DynamoDBへのアクセス権をもったユーザーのアクセスキーを設定します。

~/.aws/credential より抜粋
[test]
aws_access_key_id=AKIAxxxx(snip)xxxx
aws_secret_access_key=xxxx(snip)xxxx
~/.aws/config より抜粋
[profile test]
region=ap-northeast-1
cli_pager=

この状態でaws dynamodb list-tablesコマンドをデバッグモードで実行して利用するエンドポイントを確認します。

結果を抜粋すると以下の通りエンドポイントはdynamodb.ap-northeast-1.amazonaws.comであることが分かります。
加えてAccountIdEndpointMode = preferredと新しい設定が増えていることも見て取れます。

# 従来の挙動を確認
PS C:\> $env:AWS_PROFILE="test"
PS C:\> aws dynamodb list-tables --debug
#
# ・・・省略・・・
#
2025-03-26 17:44:41,700 - MainThread - botocore.regions - DEBUG - Calling endpoint provider with parameters: {'Region': 'ap-northeast-1', 'UseDualStack': False, 'UseFIPS': False, 'AccountIdEndpointMode': 'preferred'}
2025-03-26 17:44:41,701 - MainThread - botocore.regions - DEBUG - Endpoint provider result: https://dynamodb.ap-northeast-1.amazonaws.com
#
# ・・・省略・・・
#
2025-03-26 17:44:41,704 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): dynamodb.ap-northeast-1.amazonaws.com:443
2025-03-26 17:44:42,327 - MainThread - urllib3.connectionpool - DEBUG - https://dynamodb.ap-northeast-1.amazonaws.com:443 "POST / HTTP/1.1" 200 27
#
# ・・・省略・・・
#

新しい挙動

ここから新しい挙動を確認するために~/.aws/credentialの設定にaws_account_idの指定を増やしてやります。

~/.aws/credential より抜粋
[test]
aws_access_key_id=AKIAxxxxxxxxxxxxxxx
aws_secret_access_key=xxxx(snip)xxxx
# ↓ アカウントIDの指定を追記
aws_account_id=111111111111

再度aws dynamodb list-tablesコマンドをデバッグモードで実行して利用するエンドポイントを確認すると、今度はエンドポイントが111111111111.ddb.ap-northeast-1.amazonaws.comに切り替わりました。

# 新しい挙動を確認
PS C:\> $env:AWS_PROFILE="test"
PS C:\> aws dynamodb list-tables --debug
#
# ・・・省略・・・
#
2025-03-26 17:46:25,869 - MainThread - botocore.regions - DEBUG - Calling endpoint provider with parameters: {'Region': 'ap-northeast-1', 'UseDualStack': False, 'UseFIPS': False, 'AccountId': '111111111111', 'AccountIdEndpointMode': 'preferred'}
2025-03-26 17:46:25,869 - MainThread - botocore.regions - DEBUG - Endpoint provider result: https://111111111111.ddb.ap-northeast-1.amazonaws.com
#
# ・・・省略・・・
#
2025-03-26 17:46:25,875 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): 111111111111.ddb.ap-northeast-1.amazonaws.com:443
2025-03-26 17:46:26,495 - MainThread - urllib3.connectionpool - DEBUG - https://111111111111.ddb.ap-northeast-1.amazonaws.com:443 "POST / HTTP/1.1" 200 27
#
# ・・・省略・・・
#

アカウントIDの取得方法

設定ファイルにおいてaws_account_idキーを指定するだけでなく、スイッチロールする場合においてもrole_arnで指定されたAWSアカウントのエンドポイントを使う挙動をしました。

例えば下記の様なスイッチロール設定を~/.aws/configに記載した場合も、スイッチ先のアカウント2222222222222の値からアカウントID毎のエンドポイント使いました。

~/.aws/config 設定例
[profile test2]
region=ap-northeast-1
role_arn=arn:aws:iam::2222222222222:role/your-role-name
source_profile=source

おまけ : AWS_DISABLE_HOST_PREFIX_INJECTION 環境変数

本記事の内容とは全く別の話になるのですが、エンドポイントに関わる機能としてAWS CLI Ver.2.24.16およびbotocore Ver.1.37.5よりAWS_DISABLE_HOST_PREFIX_INJECTIONという環境変数が利用可能となっています。

https://github.com/boto/botocore/pull/3405

https://github.com/aws/aws-cli/pull/9268

こちらの機能はまだドキュメント化されていないのですが、プルリクエストの内容を読み解く限りでは「特定AWSサービスのエンドポイントを指定する際に自動で付与されるプレフィックスを無効化する」機能の様です。
たとえばAWS HealthOmicsのエンドポイントは機能に応じて

  • control-storage-omics.<region>.amazonaws.com
  • analytics-omics.<region>.amazonaws.com
  • workflows-omics.<region>.amazonaws.com

に分かれているのですが、botocoreやAWS CLIの実装上はomics.<region>.amazonaws.comに対し

  • control-storage-
  • analytics-
  • workflows-

の部分をプレフィックスとして付与する形になっています。

このため、これまではデバッグなどでエンドポイント指定をhttps://localhostにした場合にリクエスト先がhttps://control-storage-localhostといったURLになってしまう問題がありました。

# プルリクエストに記載されているエラー例を転記
$ aws omics create-sequence-store --name "test-sequence-store1" --description "Test store" --endpoint-url https://localhost:1234/ --tags "Environment=Test"

Could not connect to the endpoint URL: "https://control-storage-localhost:1234/sequencestore"

AWS_DISABLE_HOST_PREFIX_INJECTION環境変数の値をTrueにすることでプレフィックスの付与をせずリクエスト先をhttps://localhostのままにすることが可能となりました。

# プルリクエストに記載されている実行例を転記
$ AWS_DISABLE_HOST_PREFIX_INJECTION=True aws omics create-sequence-store --name "test-sequence-store1" --description "Test store" --endpoint-url https://localhost:1234/ --tags "Environment=Test"

Could not connect to the endpoint URL: "https://localhost:1234/sequencestore"

本記事の調査中にこの機能も発見したのでおまけとして追記しておきます。

最後に

以上となります。

エンドポイントの選択は自動で行われるので利用者が意識することは少ないでしょうが、機能が増えたことを覚えておいて損は無いと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.