![[AWS] AWSアカウントベースのエンドポイントが増えました (現在はDynamoDBのみ対応)](https://images.ctfassets.net/ct0aopd36mqt/wp-thumbnail-cd6bca3e0ea12bce10d34b5c73117202/e7dcb00f209227795370c8effc01051d/aws-eyecatch.png)
[AWS] AWSアカウントベースのエンドポイントが増えました (現在はDynamoDBのみ対応)
しばたです。
いつも通り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に記載の通り詳細は以下のドキュメントにあります。
従来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 以降
となっています。
現在非対応のSDKも将来的には対応するものと思います。
ちなみにAWS SDK for .NETがまだ非対応なので必然的にAWS Tools for PowerShellも非対応となっています。
動作確認
ここからは実際にAWS CLIを使って動作確認していきます。
注意点
バグなのか意図した挙動なのかはっきりしないのですが、現状AWS CLIにおいてはAWS_ACCOUNT_ID
環境変数を指定してもエンドポイントは変わらず、設定ファイルでAWSアカウントIDを指定する必要がありました。
botocoreの方のプルリクエストには環境変数のサポートが記述されてるのでなんとなくですがバグな予感がします。
AWS CLIのプルリクエストはこちらになります。
ちなみに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へのアクセス権をもったユーザーのアクセスキーを設定します。
[test]
aws_access_key_id=AKIAxxxx(snip)xxxx
aws_secret_access_key=xxxx(snip)xxxx
[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
の指定を増やしてやります。
[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毎のエンドポイント使いました。
[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
という環境変数が利用可能となっています。
こちらの機能はまだドキュメント化されていないのですが、プルリクエストの内容を読み解く限りでは「特定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"
本記事の調査中にこの機能も発見したのでおまけとして追記しておきます。
最後に
以上となります。
エンドポイントの選択は自動で行われるので利用者が意識することは少ないでしょうが、機能が増えたことを覚えておいて損は無いと思います。