Account ListRegions and GetRegionOptStatus omit or reject ap-east-2 and ap-southeast-6

Open Beginner friendly
#345 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
76/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
aws, rust
Domain
backend, cloud

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

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from aws/aws-emulator

All issues in aws/aws-emulator

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.