Account ListRegions and GetRegionOptStatus omit or reject ap-east-2 and ap-southeast-6
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 76/100
Research direction
Start with the REGION_CATALOG in src/state.rs, which the issue identifies as the source of both behaviors. Check how ListRegions enumerates the catalog and how GetRegionOptStatus validates names, then find the related tests. Done means both codes appear in the complete region list and status lookups accept them, while the invalid control remains rejected.
Written by the indexing model from the issue text.
Description
Before you file
- I searched open and recently closed issues and found no report of this.
- I checked that this still happens with the latest version of the emulator.
What happened
Account's ListRegions omits Asia Pacific (Taipei), ap-east-2, and Asia Pacific (New Zealand), ap-southeast-6. GetRegionOptStatus rejects both as unknown Region codes.
Reproduced on 2026-11-13 with boto3/botocore 1.43.108, signing Region us-east-1, against a local HTTPS instance built from public source 32b3cf39b49b34d906693dfa43539d42886b562b, the current v1.0.338 release source.
ListRegions({"MaxResults":50}) returned HTTP 200 with 32 Regions, neither of these names, and no NextToken. A complete paginated read returned the same 32 entries in pages of 17 and 15; a final unpaginated read was identical.
For GetRegionOptStatus({"RegionName":"ap-east-2"}), the complete response body was HTTP 400:
{"__type":"ValidationException","message":"RegionName \"ap-east-2\" is not an Amazon Web Services Region code","reason":"fieldValidationFailed","fieldList":[{"name":"RegionName","message":"\"ap-east-2\" is not an Amazon Web Services Region code"}]}
The request with {"RegionName":"ap-southeast-6"} returned the same error structure, substituting ap-southeast-6 in both messages.
Controls succeeded: ap-southeast-7 returned HTTP 200 / DISABLED; us-east-1 returned HTTP 200 / ENABLED_BY_DEFAULT. The deliberately invalid zz-nowhere-1 returned HTTP 400 / ValidationException.
What you expected
Both valid commercial Regions should appear in the complete region list and support a successful status lookup. Their actual opt-in status depends on the account; a disabled Region is still a valid Region.
This expectation comes from current AWS documentation, not a new live-AWS comparison:
- AWS Regions lists 34 commercial Regions, including Taipei and New Zealand, both requiring opt-in.
- ListRegions lists the account's Regions and their opt-in statuses.
- GetRegionOptStatus accepts a Region code and returns HTTP 200 with its name and status.
Steps to reproduce
Configure the emulator-generated credentials and CA in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_CA_BUNDLE; set AWS_ENDPOINT_URL to its explicit local HTTPS endpoint. Install boto3==1.43.108. These are the SDK operations used by the recorded read-only probe:
import json
import os
from urllib.parse import urlsplit
import boto3
from botocore.config import Config
from botocore.exceptions import ClientError
endpoint = os.environ["AWS_ENDPOINT_URL"]
assert urlsplit(endpoint).hostname in {"127.0.0.1", "localhost", "::1"}
client = boto3.client(
"account",
region_name="us-east-1",
endpoint_url=endpoint,
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
verify=os.environ["AWS_CA_BUNDLE"],
config=Config(
connect_timeout=5, read_timeout=10,
retries={"total_max_attempts": 1}, proxies={},
),
)
try:
first = client.list_regions(MaxResults=50)
print(json.dumps(first, indent=2))
assert not first.get("NextToken")
assert {"ap-east-2", "ap-southeast-6"}.isdisjoint(
item["RegionName"] for item in first["Regions"]
)
regions, token = [], None
for _ in range(3):
request = {"MaxResults": 17}
if token is not None:
request["NextToken"] = token
page = client.list_regions(**request)
regions.extend(page["Regions"])
token = page.get("NextToken")
if token is None:
break
assert token is None and regions == first["Regions"]
for region in (
"ap-east-2", "ap-southeast-6", "ap-southeast-7",
"us-east-1", "zz-nowhere-1",
):
try:
response = client.get_region_opt_status(RegionName=region)
except ClientError as error:
response = error.response
print(region, json.dumps(response, indent=2))
assert client.list_regions(MaxResults=50)["Regions"] == first["Regions"]
finally:
client.close()
The recorded run used https://127.0.0.1:39306 inside an owned isolated network namespace. It made nine read-only SDK calls on an already-running emulator. It created no resources and made no region enable/disable requests.
Emulator version
Version: 0.1.0-dev
Release date: unreleased
Commit: unknown
Built from public source 32b3cf39b49b34d906693dfa43539d42886b562b
Source tag: v1.0.338
SDK: boto3 1.43.108 / botocore 1.43.108
The embedded version text is the recorded output for this source-built binary; this is not presented as an installed release package.
Impact and workaround
Applications discovering supported Regions or checking account opt-in status cannot exercise the Taipei and New Zealand paths. A different supported Region avoids this particular gap.
Additional context
The current Account service's REGION_CATALOG in src/state.rs contains 32 entries and lacks both names. ListRegions enumerates that catalog; GetRegionOptStatus rejects names absent from it. These are two observed effects of one catalog omission.
Duplicate review covered 344 open/closed GitHub issues, 41 comments, and both checked-in catalogs (20,160 files). Existing #83 concerns EC2 access after successful Account region enablement. The Account catalog's existing default-region refusal, validation, pagination, and resolved stub reports cover different behavior.
The run occurred at 2026-11-13T01:18:21Z. All nine requests were independently reserialized and all nine raw responses decoded and reparsed, including the modeled error fields: six HTTP 200 responses and three HTTP 400 responses. Captured response bodies total 7,072 bytes. The repeated complete region/status view was unchanged; this is not a claim of full Account-store inspection.
Binary SHA-256: 1fd99efec02a719bda0284dd7d3d3f00945e71511891876df827635912055658. Raw result SHA-256: 11027fef76e5351c392097431ecbec671e62d584c8a200d303649f7bf2ee9bc3. The fixture, source, raw responses, and qualification evidence are retained. No live-AWS request was made.
- Dominant language
- Rust
- Stars
- 2.2k
- Forks
- 44
- PR merge metrics
- No merged PRs in 30d
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from aws/aws-emulator
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
aws/aws-emulator#333 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
aws/aws-emulator#327 · 1 comment ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
aws/aws-emulator#313 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 63/100
aws/aws-emulator#272 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
aws/aws-emulator#173 ·
All issues in aws/aws-emulator
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
ElectronicWave/Elemental#252 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
area:mcp effort:low P5 source:agent
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
jlcodes99/cockpit-tools#3103 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
eliasstravik/herdr-projects#1032 ·